/*** Autogenerated by WIDL 10.8 from include/windows.ui.notifications.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_ui_notifications_h__
#define __windows_ui_notifications_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent ABI::Windows::UI::Notifications::IAdaptiveNotificationContent
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IAdaptiveNotificationContent;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText ABI::Windows::UI::Notifications::IAdaptiveNotificationText
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IAdaptiveNotificationText;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification ABI::Windows::UI::Notifications::IBadgeNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory ABI::Windows::UI::Notifications::IBadgeNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser ABI::Windows::UI::Notifications::IBadgeUpdateManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics ABI::Windows::UI::Notifications::IBadgeUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 ABI::Windows::UI::Notifications::IBadgeUpdateManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater ABI::Windows::UI::Notifications::IBadgeUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics ABI::Windows::UI::Notifications::IKnownAdaptiveNotificationHintsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownAdaptiveNotificationHintsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics ABI::Windows::UI::Notifications::IKnownAdaptiveNotificationTextStylesStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownAdaptiveNotificationTextStylesStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics ABI::Windows::UI::Notifications::IKnownNotificationBindingsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownNotificationBindingsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotification __x_ABI_CWindows_CUI_CNotifications_CINotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotification ABI::Windows::UI::Notifications::INotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding ABI::Windows::UI::Notifications::INotificationBinding
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationBinding;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationData __x_ABI_CWindows_CUI_CNotifications_CINotificationData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData ABI::Windows::UI::Notifications::INotificationData
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationData;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory ABI::Windows::UI::Notifications::INotificationDataFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationDataFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual ABI::Windows::UI::Notifications::INotificationVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification ABI::Windows::UI::Notifications::IScheduledTileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledTileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory ABI::Windows::UI::Notifications::IScheduledTileNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledTileNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification ABI::Windows::UI::Notifications::IScheduledToastNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 ABI::Windows::UI::Notifications::IScheduledToastNotification2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 ABI::Windows::UI::Notifications::IScheduledToastNotification3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 ABI::Windows::UI::Notifications::IScheduledToastNotification4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory ABI::Windows::UI::Notifications::IScheduledToastNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs ABI::Windows::UI::Notifications::IScheduledToastNotificationShowingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotificationShowingEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification ABI::Windows::UI::Notifications::IShownTileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IShownTileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification ABI::Windows::UI::Notifications::ITileFlyoutNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory ABI::Windows::UI::Notifications::ITileFlyoutNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics ABI::Windows::UI::Notifications::ITileFlyoutUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater ABI::Windows::UI::Notifications::ITileFlyoutUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileNotification __x_ABI_CWindows_CUI_CNotifications_CITileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification ABI::Windows::UI::Notifications::ITileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory ABI::Windows::UI::Notifications::ITileNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser ABI::Windows::UI::Notifications::ITileUpdateManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics ABI::Windows::UI::Notifications::ITileUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 ABI::Windows::UI::Notifications::ITileUpdateManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater __x_ABI_CWindows_CUI_CNotifications_CITileUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater ABI::Windows::UI::Notifications::ITileUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 ABI::Windows::UI::Notifications::ITileUpdater2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdater2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs ABI::Windows::UI::Notifications::IToastActivatedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastActivatedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 ABI::Windows::UI::Notifications::IToastActivatedEventArgs2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastActivatedEventArgs2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollection __x_ABI_CWindows_CUI_CNotifications_CIToastCollection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection ABI::Windows::UI::Notifications::IToastCollection
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollection;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory ABI::Windows::UI::Notifications::IToastCollectionFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollectionFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager ABI::Windows::UI::Notifications::IToastCollectionManager
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollectionManager;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs ABI::Windows::UI::Notifications::IToastDismissedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastDismissedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs ABI::Windows::UI::Notifications::IToastFailedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastFailedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification __x_ABI_CWindows_CUI_CNotifications_CIToastNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification ABI::Windows::UI::Notifications::IToastNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 ABI::Windows::UI::Notifications::IToastNotification2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 ABI::Windows::UI::Notifications::IToastNotification3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 ABI::Windows::UI::Notifications::IToastNotification4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 ABI::Windows::UI::Notifications::IToastNotification6
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification6;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail ABI::Windows::UI::Notifications::IToastNotificationActionTriggerDetail
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationActionTriggerDetail;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory ABI::Windows::UI::Notifications::IToastNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory ABI::Windows::UI::Notifications::IToastNotificationHistory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 ABI::Windows::UI::Notifications::IToastNotificationHistory2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistory2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail ABI::Windows::UI::Notifications::IToastNotificationHistoryChangedTriggerDetail
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistoryChangedTriggerDetail;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 ABI::Windows::UI::Notifications::IToastNotificationHistoryChangedTriggerDetail2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistoryChangedTriggerDetail2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser ABI::Windows::UI::Notifications::IToastNotificationManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 ABI::Windows::UI::Notifications::IToastNotificationManagerForUser2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 ABI::Windows::UI::Notifications::IToastNotificationManagerForUser3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics ABI::Windows::UI::Notifications::IToastNotificationManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics5
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier ABI::Windows::UI::Notifications::IToastNotifier
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 ABI::Windows::UI::Notifications::IToastNotifier2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 ABI::Windows::UI::Notifications::IToastNotifier3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotification __x_ABI_CWindows_CUI_CNotifications_CIUserNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification ABI::Windows::UI::Notifications::IUserNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IUserNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs ABI::Windows::UI::Notifications::IUserNotificationChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IUserNotificationChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class AdaptiveNotificationText;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationText_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class BadgeNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CBadgeNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CBadgeNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class BadgeUpdateManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class BadgeUpdateManagerForUser;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdateManagerForUser_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class BadgeUpdater;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater __x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CBadgeUpdater_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class KnownAdaptiveNotificationHints;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints __x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationHints_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class KnownAdaptiveNotificationTextStyles;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles __x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CKnownAdaptiveNotificationTextStyles_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class KnownNotificationBindings;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings __x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CKnownNotificationBindings_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class Notification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CNotification __x_ABI_CWindows_CUI_CNotifications_CNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationBinding_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationBinding_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class NotificationBinding;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CNotificationBinding __x_ABI_CWindows_CUI_CNotifications_CNotificationBinding;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CNotificationBinding_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationData_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationData_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class NotificationData;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CNotificationData __x_ABI_CWindows_CUI_CNotifications_CNotificationData;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CNotificationData_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CNotificationVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CNotificationVisual_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class NotificationVisual;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CNotificationVisual __x_ABI_CWindows_CUI_CNotifications_CNotificationVisual;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CNotificationVisual_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ScheduledTileNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CScheduledTileNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ScheduledToastNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ScheduledToastNotificationShowingEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs __x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CShownTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CShownTileNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ShownTileNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CShownTileNotification __x_ABI_CWindows_CUI_CNotifications_CShownTileNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CShownTileNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileFlyoutNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileFlyoutUpdateManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdateManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileFlyoutUpdater;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileFlyoutUpdater_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileNotification __x_ABI_CWindows_CUI_CNotifications_CTileNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileUpdateManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager __x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileUpdateManagerForUser;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileUpdateManagerForUser_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CTileUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CTileUpdater_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class TileUpdater;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CTileUpdater __x_ABI_CWindows_CUI_CNotifications_CTileUpdater;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CTileUpdater_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastActivatedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs __x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastActivatedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastCollection_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastCollection;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastCollection __x_ABI_CWindows_CUI_CNotifications_CToastCollection;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastCollection_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastCollectionManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastCollectionManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastDismissedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs __x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastDismissedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastFailedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs __x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastFailedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotification __x_ABI_CWindows_CUI_CNotifications_CToastNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationActionTriggerDetail;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationActionTriggerDetail_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationHistory;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory __x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistory_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationHistoryChangedTriggerDetail;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationManager;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager __x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManager_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotificationManagerForUser;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser __x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotificationManagerForUser_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CToastNotifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CToastNotifier_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class ToastNotifier;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CToastNotifier __x_ABI_CWindows_CUI_CNotifications_CToastNotifier;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CToastNotifier_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CUserNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CUserNotification_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class UserNotification;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CUserNotification __x_ABI_CWindows_CUI_CNotifications_CUserNotification;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CUserNotification_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                class UserNotificationChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedEventArgs_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CToastCollection __FIIterable_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CToastNotification __FIIterable_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CUserNotification __FIIterable_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CToastCollection __FIIterator_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CToastNotification __FIIterator_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CUserNotification __FIIterator_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* >
#endif /* __cplusplus */
#endif

#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
typedef interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs;
#ifdef __cplusplus
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.applicationmodel.h>
#include <windows.data.xml.dom.h>
#include <windows.system.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CNotificationKinds __x_ABI_CWindows_CUI_CNotifications_CNotificationKinds;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent ABI::Windows::UI::Notifications::IAdaptiveNotificationContent
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IAdaptiveNotificationContent;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText ABI::Windows::UI::Notifications::IAdaptiveNotificationText
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IAdaptiveNotificationText;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification ABI::Windows::UI::Notifications::IBadgeNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory ABI::Windows::UI::Notifications::IBadgeNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser ABI::Windows::UI::Notifications::IBadgeUpdateManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics ABI::Windows::UI::Notifications::IBadgeUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 ABI::Windows::UI::Notifications::IBadgeUpdateManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdateManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater ABI::Windows::UI::Notifications::IBadgeUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IBadgeUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics ABI::Windows::UI::Notifications::IKnownAdaptiveNotificationHintsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownAdaptiveNotificationHintsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics ABI::Windows::UI::Notifications::IKnownAdaptiveNotificationTextStylesStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownAdaptiveNotificationTextStylesStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics ABI::Windows::UI::Notifications::IKnownNotificationBindingsStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IKnownNotificationBindingsStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotification __x_ABI_CWindows_CUI_CNotifications_CINotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotification ABI::Windows::UI::Notifications::INotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding ABI::Windows::UI::Notifications::INotificationBinding
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationBinding;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationData __x_ABI_CWindows_CUI_CNotifications_CINotificationData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData ABI::Windows::UI::Notifications::INotificationData
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationData;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory ABI::Windows::UI::Notifications::INotificationDataFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationDataFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual ABI::Windows::UI::Notifications::INotificationVisual
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface INotificationVisual;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification ABI::Windows::UI::Notifications::IScheduledTileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledTileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory ABI::Windows::UI::Notifications::IScheduledTileNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledTileNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification ABI::Windows::UI::Notifications::IScheduledToastNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 ABI::Windows::UI::Notifications::IScheduledToastNotification2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 ABI::Windows::UI::Notifications::IScheduledToastNotification3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 ABI::Windows::UI::Notifications::IScheduledToastNotification4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotification4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory ABI::Windows::UI::Notifications::IScheduledToastNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs ABI::Windows::UI::Notifications::IScheduledToastNotificationShowingEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IScheduledToastNotificationShowingEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification ABI::Windows::UI::Notifications::IShownTileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IShownTileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification ABI::Windows::UI::Notifications::ITileFlyoutNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory ABI::Windows::UI::Notifications::ITileFlyoutNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics ABI::Windows::UI::Notifications::ITileFlyoutUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater ABI::Windows::UI::Notifications::ITileFlyoutUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileFlyoutUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileNotification __x_ABI_CWindows_CUI_CNotifications_CITileNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification ABI::Windows::UI::Notifications::ITileNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory ABI::Windows::UI::Notifications::ITileNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser ABI::Windows::UI::Notifications::ITileUpdateManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics ABI::Windows::UI::Notifications::ITileUpdateManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 ABI::Windows::UI::Notifications::ITileUpdateManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdateManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater __x_ABI_CWindows_CUI_CNotifications_CITileUpdater;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater ABI::Windows::UI::Notifications::ITileUpdater
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdater;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 ABI::Windows::UI::Notifications::ITileUpdater2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface ITileUpdater2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs ABI::Windows::UI::Notifications::IToastActivatedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastActivatedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 ABI::Windows::UI::Notifications::IToastActivatedEventArgs2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastActivatedEventArgs2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollection __x_ABI_CWindows_CUI_CNotifications_CIToastCollection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection ABI::Windows::UI::Notifications::IToastCollection
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollection;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory ABI::Windows::UI::Notifications::IToastCollectionFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollectionFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager ABI::Windows::UI::Notifications::IToastCollectionManager
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastCollectionManager;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs ABI::Windows::UI::Notifications::IToastDismissedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastDismissedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs ABI::Windows::UI::Notifications::IToastFailedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastFailedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification __x_ABI_CWindows_CUI_CNotifications_CIToastNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification ABI::Windows::UI::Notifications::IToastNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 ABI::Windows::UI::Notifications::IToastNotification2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 ABI::Windows::UI::Notifications::IToastNotification3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 ABI::Windows::UI::Notifications::IToastNotification4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 ABI::Windows::UI::Notifications::IToastNotification6
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotification6;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail ABI::Windows::UI::Notifications::IToastNotificationActionTriggerDetail
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationActionTriggerDetail;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory ABI::Windows::UI::Notifications::IToastNotificationFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory ABI::Windows::UI::Notifications::IToastNotificationHistory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 ABI::Windows::UI::Notifications::IToastNotificationHistory2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistory2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail ABI::Windows::UI::Notifications::IToastNotificationHistoryChangedTriggerDetail
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistoryChangedTriggerDetail;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 ABI::Windows::UI::Notifications::IToastNotificationHistoryChangedTriggerDetail2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationHistoryChangedTriggerDetail2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser ABI::Windows::UI::Notifications::IToastNotificationManagerForUser
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 ABI::Windows::UI::Notifications::IToastNotificationManagerForUser2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 ABI::Windows::UI::Notifications::IToastNotificationManagerForUser3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerForUser3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics ABI::Windows::UI::Notifications::IToastNotificationManagerStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics4
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics4;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 ABI::Windows::UI::Notifications::IToastNotificationManagerStatics5
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotificationManagerStatics5;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier ABI::Windows::UI::Notifications::IToastNotifier
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 ABI::Windows::UI::Notifications::IToastNotifier2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 ABI::Windows::UI::Notifications::IToastNotifier3
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IToastNotifier3;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotification __x_ABI_CWindows_CUI_CNotifications_CIUserNotification;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification ABI::Windows::UI::Notifications::IUserNotification
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IUserNotification;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs ABI::Windows::UI::Notifications::IUserNotificationChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                interface IUserNotificationChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CToastCollection __FIIterable_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CToastNotification __FIIterable_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CUI__CNotifications__CUserNotification __FIIterable_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CToastCollection __FIIterator_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CToastNotification __FIIterator_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CUI__CNotifications__CUserNotification __FIIterator_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
#define ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_FWD_DEFINED__
typedef interface __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding;
#ifdef __cplusplus
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Notifications::NotificationBinding* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_FWD_DEFINED__
typedef interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification;
#ifdef __cplusplus
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum AdaptiveNotificationContentKind {
                    AdaptiveNotificationContentKind_Text = 0
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind {
    AdaptiveNotificationContentKind_Text = 0
};
#ifdef WIDL_using_Windows_UI_Notifications
#define AdaptiveNotificationContentKind __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum BadgeTemplateType {
                    BadgeTemplateType_BadgeGlyph = 0,
                    BadgeTemplateType_BadgeNumber = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType {
    BadgeTemplateType_BadgeGlyph = 0,
    BadgeTemplateType_BadgeNumber = 1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define BadgeTemplateType __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum NotificationKinds {
                    NotificationKinds_Unknown = 0x0,
                    NotificationKinds_Toast = 0x1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CNotificationKinds {
    NotificationKinds_Unknown = 0x0,
    NotificationKinds_Toast = 0x1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define NotificationKinds __x_ABI_CWindows_CUI_CNotifications_CNotificationKinds
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum NotificationMirroring {
                    NotificationMirroring_Allowed = 0,
                    NotificationMirroring_Disabled = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring {
    NotificationMirroring_Allowed = 0,
    NotificationMirroring_Disabled = 1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum NotificationSetting {
                    NotificationSetting_Enabled = 0,
                    NotificationSetting_DisabledForApplication = 1,
                    NotificationSetting_DisabledForUser = 2,
                    NotificationSetting_DisabledByGroupPolicy = 3,
                    NotificationSetting_DisabledByManifest = 4
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting {
    NotificationSetting_Enabled = 0,
    NotificationSetting_DisabledForApplication = 1,
    NotificationSetting_DisabledForUser = 2,
    NotificationSetting_DisabledByGroupPolicy = 3,
    NotificationSetting_DisabledByManifest = 4
};
#ifdef WIDL_using_Windows_UI_Notifications
#define NotificationSetting __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum NotificationUpdateResult {
                    NotificationUpdateResult_Succeeded = 0,
                    NotificationUpdateResult_Failed = 1,
                    NotificationUpdateResult_NotificationNotFound = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult {
    NotificationUpdateResult_Succeeded = 0,
    NotificationUpdateResult_Failed = 1,
    NotificationUpdateResult_NotificationNotFound = 2
};
#ifdef WIDL_using_Windows_UI_Notifications
#define NotificationUpdateResult __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum PeriodicUpdateRecurrence {
                    PeriodicUpdateRecurrence_HalfHour = 0,
                    PeriodicUpdateRecurrence_Hour = 1,
                    PeriodicUpdateRecurrence_SixHours = 2,
                    PeriodicUpdateRecurrence_TwelveHours = 3,
                    PeriodicUpdateRecurrence_Daily = 4
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence {
    PeriodicUpdateRecurrence_HalfHour = 0,
    PeriodicUpdateRecurrence_Hour = 1,
    PeriodicUpdateRecurrence_SixHours = 2,
    PeriodicUpdateRecurrence_TwelveHours = 3,
    PeriodicUpdateRecurrence_Daily = 4
};
#ifdef WIDL_using_Windows_UI_Notifications
#define PeriodicUpdateRecurrence __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum TileFlyoutTemplateType {
                    TileFlyoutTemplateType_TileFlyoutTemplate01 = 0
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType {
    TileFlyoutTemplateType_TileFlyoutTemplate01 = 0
};
#ifdef WIDL_using_Windows_UI_Notifications
#define TileFlyoutTemplateType __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum TileTemplateType {
                    TileTemplateType_TileSquareImage = 0,
                    TileTemplateType_TileSquareBlock = 1,
                    TileTemplateType_TileSquareText01 = 2,
                    TileTemplateType_TileSquareText02 = 3,
                    TileTemplateType_TileSquareText03 = 4,
                    TileTemplateType_TileSquareText04 = 5,
                    TileTemplateType_TileSquarePeekImageAndText01 = 6,
                    TileTemplateType_TileSquarePeekImageAndText02 = 7,
                    TileTemplateType_TileSquarePeekImageAndText03 = 8,
                    TileTemplateType_TileSquarePeekImageAndText04 = 9,
                    TileTemplateType_TileWideImage = 10,
                    TileTemplateType_TileWideImageCollection = 11,
                    TileTemplateType_TileWideImageAndText01 = 12,
                    TileTemplateType_TileWideImageAndText02 = 13,
                    TileTemplateType_TileWideBlockAndText01 = 14,
                    TileTemplateType_TileWideBlockAndText02 = 15,
                    TileTemplateType_TileWidePeekImageCollection01 = 16,
                    TileTemplateType_TileWidePeekImageCollection02 = 17,
                    TileTemplateType_TileWidePeekImageCollection03 = 18,
                    TileTemplateType_TileWidePeekImageCollection04 = 19,
                    TileTemplateType_TileWidePeekImageCollection05 = 20,
                    TileTemplateType_TileWidePeekImageCollection06 = 21,
                    TileTemplateType_TileWidePeekImageAndText01 = 22,
                    TileTemplateType_TileWidePeekImageAndText02 = 23,
                    TileTemplateType_TileWidePeekImage01 = 24,
                    TileTemplateType_TileWidePeekImage02 = 25,
                    TileTemplateType_TileWidePeekImage03 = 26,
                    TileTemplateType_TileWidePeekImage04 = 27,
                    TileTemplateType_TileWidePeekImage05 = 28,
                    TileTemplateType_TileWidePeekImage06 = 29,
                    TileTemplateType_TileWideSmallImageAndText01 = 30,
                    TileTemplateType_TileWideSmallImageAndText02 = 31,
                    TileTemplateType_TileWideSmallImageAndText03 = 32,
                    TileTemplateType_TileWideSmallImageAndText04 = 33,
                    TileTemplateType_TileWideSmallImageAndText05 = 34,
                    TileTemplateType_TileWideText01 = 35,
                    TileTemplateType_TileWideText02 = 36,
                    TileTemplateType_TileWideText03 = 37,
                    TileTemplateType_TileWideText04 = 38,
                    TileTemplateType_TileWideText05 = 39,
                    TileTemplateType_TileWideText06 = 40,
                    TileTemplateType_TileWideText07 = 41,
                    TileTemplateType_TileWideText08 = 42,
                    TileTemplateType_TileWideText09 = 43,
                    TileTemplateType_TileWideText10 = 44,
                    TileTemplateType_TileWideText11 = 45,
                    TileTemplateType_TileSquare150x150Image = 0,
                    TileTemplateType_TileSquare150x150Block = 1,
                    TileTemplateType_TileSquare150x150Text01 = 2,
                    TileTemplateType_TileSquare150x150Text02 = 3,
                    TileTemplateType_TileSquare150x150Text03 = 4,
                    TileTemplateType_TileSquare150x150Text04 = 5,
                    TileTemplateType_TileSquare150x150PeekImageAndText01 = 6,
                    TileTemplateType_TileSquare150x150PeekImageAndText02 = 7,
                    TileTemplateType_TileSquare150x150PeekImageAndText03 = 8,
                    TileTemplateType_TileSquare150x150PeekImageAndText04 = 9,
                    TileTemplateType_TileWide310x150Image = 10,
                    TileTemplateType_TileWide310x150ImageCollection = 11,
                    TileTemplateType_TileWide310x150ImageAndText01 = 12,
                    TileTemplateType_TileWide310x150ImageAndText02 = 13,
                    TileTemplateType_TileWide310x150BlockAndText01 = 14,
                    TileTemplateType_TileWide310x150BlockAndText02 = 15,
                    TileTemplateType_TileWide310x150PeekImageCollection01 = 16,
                    TileTemplateType_TileWide310x150PeekImageCollection02 = 17,
                    TileTemplateType_TileWide310x150PeekImageCollection03 = 18,
                    TileTemplateType_TileWide310x150PeekImageCollection04 = 19,
                    TileTemplateType_TileWide310x150PeekImageCollection05 = 20,
                    TileTemplateType_TileWide310x150PeekImageCollection06 = 21,
                    TileTemplateType_TileWide310x150PeekImageAndText01 = 22,
                    TileTemplateType_TileWide310x150PeekImageAndText02 = 23,
                    TileTemplateType_TileWide310x150PeekImage01 = 24,
                    TileTemplateType_TileWide310x150PeekImage02 = 25,
                    TileTemplateType_TileWide310x150PeekImage03 = 26,
                    TileTemplateType_TileWide310x150PeekImage04 = 27,
                    TileTemplateType_TileWide310x150PeekImage05 = 28,
                    TileTemplateType_TileWide310x150PeekImage06 = 29,
                    TileTemplateType_TileWide310x150SmallImageAndText01 = 30,
                    TileTemplateType_TileWide310x150SmallImageAndText02 = 31,
                    TileTemplateType_TileWide310x150SmallImageAndText03 = 32,
                    TileTemplateType_TileWide310x150SmallImageAndText04 = 33,
                    TileTemplateType_TileWide310x150SmallImageAndText05 = 34,
                    TileTemplateType_TileWide310x150Text01 = 35,
                    TileTemplateType_TileWide310x150Text02 = 36,
                    TileTemplateType_TileWide310x150Text03 = 37,
                    TileTemplateType_TileWide310x150Text04 = 38,
                    TileTemplateType_TileWide310x150Text05 = 39,
                    TileTemplateType_TileWide310x150Text06 = 40,
                    TileTemplateType_TileWide310x150Text07 = 41,
                    TileTemplateType_TileWide310x150Text08 = 42,
                    TileTemplateType_TileWide310x150Text09 = 43,
                    TileTemplateType_TileWide310x150Text10 = 44,
                    TileTemplateType_TileWide310x150Text11 = 45,
                    TileTemplateType_TileSquare310x310BlockAndText01 = 46,
                    TileTemplateType_TileSquare310x310BlockAndText02 = 47,
                    TileTemplateType_TileSquare310x310Image = 48,
                    TileTemplateType_TileSquare310x310ImageAndText01 = 49,
                    TileTemplateType_TileSquare310x310ImageAndText02 = 50,
                    TileTemplateType_TileSquare310x310ImageAndTextOverlay01 = 51,
                    TileTemplateType_TileSquare310x310ImageAndTextOverlay02 = 52,
                    TileTemplateType_TileSquare310x310ImageAndTextOverlay03 = 53,
                    TileTemplateType_TileSquare310x310ImageCollectionAndText01 = 54,
                    TileTemplateType_TileSquare310x310ImageCollectionAndText02 = 55,
                    TileTemplateType_TileSquare310x310ImageCollection = 56,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList01 = 57,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList02 = 58,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList03 = 59,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList04 = 60,
                    TileTemplateType_TileSquare310x310Text01 = 61,
                    TileTemplateType_TileSquare310x310Text02 = 62,
                    TileTemplateType_TileSquare310x310Text03 = 63,
                    TileTemplateType_TileSquare310x310Text04 = 64,
                    TileTemplateType_TileSquare310x310Text05 = 65,
                    TileTemplateType_TileSquare310x310Text06 = 66,
                    TileTemplateType_TileSquare310x310Text07 = 67,
                    TileTemplateType_TileSquare310x310Text08 = 68,
                    TileTemplateType_TileSquare310x310TextList01 = 69,
                    TileTemplateType_TileSquare310x310TextList02 = 70,
                    TileTemplateType_TileSquare310x310TextList03 = 71,
                    TileTemplateType_TileSquare310x310SmallImageAndText01 = 72,
                    TileTemplateType_TileSquare310x310SmallImagesAndTextList05 = 73,
                    TileTemplateType_TileSquare310x310Text09 = 74,
                    TileTemplateType_TileSquare71x71IconWithBadge = 75,
                    TileTemplateType_TileSquare150x150IconWithBadge = 76,
                    TileTemplateType_TileWide310x150IconWithBadgeAndText = 77,
                    TileTemplateType_TileSquare71x71Image = 78,
                    TileTemplateType_TileTall150x310Image = 79
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType {
    TileTemplateType_TileSquareImage = 0,
    TileTemplateType_TileSquareBlock = 1,
    TileTemplateType_TileSquareText01 = 2,
    TileTemplateType_TileSquareText02 = 3,
    TileTemplateType_TileSquareText03 = 4,
    TileTemplateType_TileSquareText04 = 5,
    TileTemplateType_TileSquarePeekImageAndText01 = 6,
    TileTemplateType_TileSquarePeekImageAndText02 = 7,
    TileTemplateType_TileSquarePeekImageAndText03 = 8,
    TileTemplateType_TileSquarePeekImageAndText04 = 9,
    TileTemplateType_TileWideImage = 10,
    TileTemplateType_TileWideImageCollection = 11,
    TileTemplateType_TileWideImageAndText01 = 12,
    TileTemplateType_TileWideImageAndText02 = 13,
    TileTemplateType_TileWideBlockAndText01 = 14,
    TileTemplateType_TileWideBlockAndText02 = 15,
    TileTemplateType_TileWidePeekImageCollection01 = 16,
    TileTemplateType_TileWidePeekImageCollection02 = 17,
    TileTemplateType_TileWidePeekImageCollection03 = 18,
    TileTemplateType_TileWidePeekImageCollection04 = 19,
    TileTemplateType_TileWidePeekImageCollection05 = 20,
    TileTemplateType_TileWidePeekImageCollection06 = 21,
    TileTemplateType_TileWidePeekImageAndText01 = 22,
    TileTemplateType_TileWidePeekImageAndText02 = 23,
    TileTemplateType_TileWidePeekImage01 = 24,
    TileTemplateType_TileWidePeekImage02 = 25,
    TileTemplateType_TileWidePeekImage03 = 26,
    TileTemplateType_TileWidePeekImage04 = 27,
    TileTemplateType_TileWidePeekImage05 = 28,
    TileTemplateType_TileWidePeekImage06 = 29,
    TileTemplateType_TileWideSmallImageAndText01 = 30,
    TileTemplateType_TileWideSmallImageAndText02 = 31,
    TileTemplateType_TileWideSmallImageAndText03 = 32,
    TileTemplateType_TileWideSmallImageAndText04 = 33,
    TileTemplateType_TileWideSmallImageAndText05 = 34,
    TileTemplateType_TileWideText01 = 35,
    TileTemplateType_TileWideText02 = 36,
    TileTemplateType_TileWideText03 = 37,
    TileTemplateType_TileWideText04 = 38,
    TileTemplateType_TileWideText05 = 39,
    TileTemplateType_TileWideText06 = 40,
    TileTemplateType_TileWideText07 = 41,
    TileTemplateType_TileWideText08 = 42,
    TileTemplateType_TileWideText09 = 43,
    TileTemplateType_TileWideText10 = 44,
    TileTemplateType_TileWideText11 = 45,
    TileTemplateType_TileSquare150x150Image = 0,
    TileTemplateType_TileSquare150x150Block = 1,
    TileTemplateType_TileSquare150x150Text01 = 2,
    TileTemplateType_TileSquare150x150Text02 = 3,
    TileTemplateType_TileSquare150x150Text03 = 4,
    TileTemplateType_TileSquare150x150Text04 = 5,
    TileTemplateType_TileSquare150x150PeekImageAndText01 = 6,
    TileTemplateType_TileSquare150x150PeekImageAndText02 = 7,
    TileTemplateType_TileSquare150x150PeekImageAndText03 = 8,
    TileTemplateType_TileSquare150x150PeekImageAndText04 = 9,
    TileTemplateType_TileWide310x150Image = 10,
    TileTemplateType_TileWide310x150ImageCollection = 11,
    TileTemplateType_TileWide310x150ImageAndText01 = 12,
    TileTemplateType_TileWide310x150ImageAndText02 = 13,
    TileTemplateType_TileWide310x150BlockAndText01 = 14,
    TileTemplateType_TileWide310x150BlockAndText02 = 15,
    TileTemplateType_TileWide310x150PeekImageCollection01 = 16,
    TileTemplateType_TileWide310x150PeekImageCollection02 = 17,
    TileTemplateType_TileWide310x150PeekImageCollection03 = 18,
    TileTemplateType_TileWide310x150PeekImageCollection04 = 19,
    TileTemplateType_TileWide310x150PeekImageCollection05 = 20,
    TileTemplateType_TileWide310x150PeekImageCollection06 = 21,
    TileTemplateType_TileWide310x150PeekImageAndText01 = 22,
    TileTemplateType_TileWide310x150PeekImageAndText02 = 23,
    TileTemplateType_TileWide310x150PeekImage01 = 24,
    TileTemplateType_TileWide310x150PeekImage02 = 25,
    TileTemplateType_TileWide310x150PeekImage03 = 26,
    TileTemplateType_TileWide310x150PeekImage04 = 27,
    TileTemplateType_TileWide310x150PeekImage05 = 28,
    TileTemplateType_TileWide310x150PeekImage06 = 29,
    TileTemplateType_TileWide310x150SmallImageAndText01 = 30,
    TileTemplateType_TileWide310x150SmallImageAndText02 = 31,
    TileTemplateType_TileWide310x150SmallImageAndText03 = 32,
    TileTemplateType_TileWide310x150SmallImageAndText04 = 33,
    TileTemplateType_TileWide310x150SmallImageAndText05 = 34,
    TileTemplateType_TileWide310x150Text01 = 35,
    TileTemplateType_TileWide310x150Text02 = 36,
    TileTemplateType_TileWide310x150Text03 = 37,
    TileTemplateType_TileWide310x150Text04 = 38,
    TileTemplateType_TileWide310x150Text05 = 39,
    TileTemplateType_TileWide310x150Text06 = 40,
    TileTemplateType_TileWide310x150Text07 = 41,
    TileTemplateType_TileWide310x150Text08 = 42,
    TileTemplateType_TileWide310x150Text09 = 43,
    TileTemplateType_TileWide310x150Text10 = 44,
    TileTemplateType_TileWide310x150Text11 = 45,
    TileTemplateType_TileSquare310x310BlockAndText01 = 46,
    TileTemplateType_TileSquare310x310BlockAndText02 = 47,
    TileTemplateType_TileSquare310x310Image = 48,
    TileTemplateType_TileSquare310x310ImageAndText01 = 49,
    TileTemplateType_TileSquare310x310ImageAndText02 = 50,
    TileTemplateType_TileSquare310x310ImageAndTextOverlay01 = 51,
    TileTemplateType_TileSquare310x310ImageAndTextOverlay02 = 52,
    TileTemplateType_TileSquare310x310ImageAndTextOverlay03 = 53,
    TileTemplateType_TileSquare310x310ImageCollectionAndText01 = 54,
    TileTemplateType_TileSquare310x310ImageCollectionAndText02 = 55,
    TileTemplateType_TileSquare310x310ImageCollection = 56,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList01 = 57,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList02 = 58,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList03 = 59,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList04 = 60,
    TileTemplateType_TileSquare310x310Text01 = 61,
    TileTemplateType_TileSquare310x310Text02 = 62,
    TileTemplateType_TileSquare310x310Text03 = 63,
    TileTemplateType_TileSquare310x310Text04 = 64,
    TileTemplateType_TileSquare310x310Text05 = 65,
    TileTemplateType_TileSquare310x310Text06 = 66,
    TileTemplateType_TileSquare310x310Text07 = 67,
    TileTemplateType_TileSquare310x310Text08 = 68,
    TileTemplateType_TileSquare310x310TextList01 = 69,
    TileTemplateType_TileSquare310x310TextList02 = 70,
    TileTemplateType_TileSquare310x310TextList03 = 71,
    TileTemplateType_TileSquare310x310SmallImageAndText01 = 72,
    TileTemplateType_TileSquare310x310SmallImagesAndTextList05 = 73,
    TileTemplateType_TileSquare310x310Text09 = 74,
    TileTemplateType_TileSquare71x71IconWithBadge = 75,
    TileTemplateType_TileSquare150x150IconWithBadge = 76,
    TileTemplateType_TileWide310x150IconWithBadgeAndText = 77,
    TileTemplateType_TileSquare71x71Image = 78,
    TileTemplateType_TileTall150x310Image = 79
};
#ifdef WIDL_using_Windows_UI_Notifications
#define TileTemplateType __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastDismissalReason {
                    ToastDismissalReason_UserCanceled = 0,
                    ToastDismissalReason_ApplicationHidden = 1,
                    ToastDismissalReason_TimedOut = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason {
    ToastDismissalReason_UserCanceled = 0,
    ToastDismissalReason_ApplicationHidden = 1,
    ToastDismissalReason_TimedOut = 2
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastDismissalReason __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastHistoryChangedType {
                    ToastHistoryChangedType_Cleared = 0,
                    ToastHistoryChangedType_Removed = 1,
                    ToastHistoryChangedType_Expired = 2,
                    ToastHistoryChangedType_Added = 3
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType {
    ToastHistoryChangedType_Cleared = 0,
    ToastHistoryChangedType_Removed = 1,
    ToastHistoryChangedType_Expired = 2,
    ToastHistoryChangedType_Added = 3
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastHistoryChangedType __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastNotificationMode {
                    ToastNotificationMode_Unrestricted = 0,
                    ToastNotificationMode_PriorityOnly = 1,
                    ToastNotificationMode_AlarmsOnly = 2
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode {
    ToastNotificationMode_Unrestricted = 0,
    ToastNotificationMode_PriorityOnly = 1,
    ToastNotificationMode_AlarmsOnly = 2
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastNotificationMode __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastNotificationPriority {
                    ToastNotificationPriority_Default = 0,
                    ToastNotificationPriority_High = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority {
    ToastNotificationPriority_Default = 0,
    ToastNotificationPriority_High = 1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastNotificationPriority __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum ToastTemplateType {
                    ToastTemplateType_ToastImageAndText01 = 0,
                    ToastTemplateType_ToastImageAndText02 = 1,
                    ToastTemplateType_ToastImageAndText03 = 2,
                    ToastTemplateType_ToastImageAndText04 = 3,
                    ToastTemplateType_ToastText01 = 4,
                    ToastTemplateType_ToastText02 = 5,
                    ToastTemplateType_ToastText03 = 6,
                    ToastTemplateType_ToastText04 = 7
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType {
    ToastTemplateType_ToastImageAndText01 = 0,
    ToastTemplateType_ToastImageAndText02 = 1,
    ToastTemplateType_ToastImageAndText03 = 2,
    ToastTemplateType_ToastImageAndText04 = 3,
    ToastTemplateType_ToastText01 = 4,
    ToastTemplateType_ToastText02 = 5,
    ToastTemplateType_ToastText03 = 6,
    ToastTemplateType_ToastText04 = 7
};
#ifdef WIDL_using_Windows_UI_Notifications
#define ToastTemplateType __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                enum UserNotificationChangedKind {
                    UserNotificationChangedKind_Added = 0,
                    UserNotificationChangedKind_Removed = 1
                };
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind {
    UserNotificationChangedKind_Added = 0,
    UserNotificationChangedKind_Removed = 1
};
#ifdef WIDL_using_Windows_UI_Notifications
#define UserNotificationChangedKind __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */
/*****************************************************************************
 * IAdaptiveNotificationContent interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent, 0xeb0dbe66, 0x7448, 0x448d, 0x9d,0xb8, 0xd7,0x8a,0xcd,0x2a,0xbb,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("eb0dbe66-7448-448d-9db8-d78acd2abba9")
                IAdaptiveNotificationContent : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Kind(
                        ABI::Windows::UI::Notifications::AdaptiveNotificationContentKind *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Hints(
                        ABI::Windows::Foundation::Collections::IMap<HSTRING,HSTRING > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent, 0xeb0dbe66, 0x7448, 0x448d, 0x9d,0xb8, 0xd7,0x8a,0xcd,0x2a,0xbb,0xa9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This,
        TrustLevel *trustLevel);

    /*** IAdaptiveNotificationContent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Kind)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This,
        __x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind *value);

    HRESULT (STDMETHODCALLTYPE *get_Hints)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent *This,
        __FIMap_2_HSTRING_HSTRING **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContentVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAdaptiveNotificationContent methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Kind(This,value) (This)->lpVtbl->get_Kind(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Hints(This,value) (This)->lpVtbl->get_Hints(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_Release(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAdaptiveNotificationContent methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Kind(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,__x_ABI_CWindows_CUI_CNotifications_CAdaptiveNotificationContentKind *value) {
    return This->lpVtbl->get_Kind(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Hints(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent* This,__FIMap_2_HSTRING_HSTRING **value) {
    return This->lpVtbl->get_Hints(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IAdaptiveNotificationContent IID___x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent
#define IAdaptiveNotificationContentVtbl __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContentVtbl
#define IAdaptiveNotificationContent __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent
#define IAdaptiveNotificationContent_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_QueryInterface
#define IAdaptiveNotificationContent_AddRef __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_AddRef
#define IAdaptiveNotificationContent_Release __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_Release
#define IAdaptiveNotificationContent_GetIids __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetIids
#define IAdaptiveNotificationContent_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetRuntimeClassName
#define IAdaptiveNotificationContent_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_GetTrustLevel
#define IAdaptiveNotificationContent_get_Kind __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Kind
#define IAdaptiveNotificationContent_get_Hints __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_get_Hints
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationContent_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IAdaptiveNotificationText interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText, 0x46d4a3be, 0x609a, 0x4326, 0xa4,0x0b, 0xbf,0xde,0x87,0x20,0x34,0xa3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("46d4a3be-609a-4326-a40b-bfde872034a3")
                IAdaptiveNotificationText : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Text(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Text(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Language(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Language(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText, 0x46d4a3be, 0x609a, 0x4326, 0xa4,0x0b, 0xbf,0xde,0x87,0x20,0x34,0xa3)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationTextVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        TrustLevel *trustLevel);

    /*** IAdaptiveNotificationText methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Text)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Text)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationTextVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAdaptiveNotificationText methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Text(This,value) (This)->lpVtbl->get_Text(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Text(This,value) (This)->lpVtbl->put_Text(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Language(This,value) (This)->lpVtbl->get_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Language(This,value) (This)->lpVtbl->put_Language(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_Release(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAdaptiveNotificationText methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Text(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING *value) {
    return This->lpVtbl->get_Text(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Text(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING value) {
    return This->lpVtbl->put_Text(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Language(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING *value) {
    return This->lpVtbl->get_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Language(__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText* This,HSTRING value) {
    return This->lpVtbl->put_Language(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IAdaptiveNotificationText IID___x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText
#define IAdaptiveNotificationTextVtbl __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationTextVtbl
#define IAdaptiveNotificationText __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText
#define IAdaptiveNotificationText_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_QueryInterface
#define IAdaptiveNotificationText_AddRef __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_AddRef
#define IAdaptiveNotificationText_Release __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_Release
#define IAdaptiveNotificationText_GetIids __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetIids
#define IAdaptiveNotificationText_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetRuntimeClassName
#define IAdaptiveNotificationText_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_GetTrustLevel
#define IAdaptiveNotificationText_get_Text __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Text
#define IAdaptiveNotificationText_put_Text __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Text
#define IAdaptiveNotificationText_get_Language __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_get_Language
#define IAdaptiveNotificationText_put_Language __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_put_Language
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IBadgeNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification, 0x075cb4ca, 0xd08a, 0x4e2f, 0x92,0x33, 0x7e,0x28,0x9c,0x1f,0x77,0x22);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("075cb4ca-d08a-4e2f-9233-7e289c1f7722")
                IBadgeNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification, 0x075cb4ca, 0xd08a, 0x4e2f, 0x92,0x33, 0x7e,0x28,0x9c,0x1f,0x77,0x22)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        TrustLevel *trustLevel);

    /*** IBadgeNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *This,
        __FIReference_1_DateTime **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeNotification IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification
#define IBadgeNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationVtbl
#define IBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification
#define IBadgeNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_QueryInterface
#define IBadgeNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_AddRef
#define IBadgeNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_Release
#define IBadgeNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetIids
#define IBadgeNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetRuntimeClassName
#define IBadgeNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_GetTrustLevel
#define IBadgeNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_Content
#define IBadgeNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_put_ExpirationTime
#define IBadgeNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_get_ExpirationTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IBadgeNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory, 0xedf255ce, 0x0618, 0x4d59, 0x94,0x8a, 0x5a,0x61,0x04,0x0c,0x52,0xf9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("edf255ce-0618-4d59-948a-5a61040c52f9")
                IBadgeNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::UI::Notifications::IBadgeNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory, 0xedf255ce, 0x0618, 0x4d59, 0x94,0x8a, 0x5a,0x61,0x04,0x0c,0x52,0xf9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory *This,
        TrustLevel *trustLevel);

    /*** IBadgeNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBadgeNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_CreateBadgeNotification(This,content,value) (This)->lpVtbl->CreateBadgeNotification(This,content,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_CreateBadgeNotification(__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification **value) {
    return This->lpVtbl->CreateBadgeNotification(This,content,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory
#define IBadgeNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactoryVtbl
#define IBadgeNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory
#define IBadgeNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_QueryInterface
#define IBadgeNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_AddRef
#define IBadgeNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_Release
#define IBadgeNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetIids
#define IBadgeNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetRuntimeClassName
#define IBadgeNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_GetTrustLevel
#define IBadgeNotificationFactory_CreateBadgeNotification __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_CreateBadgeNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIBadgeNotificationFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IBadgeUpdateManagerForUser interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser, 0x996b21bc, 0x0386, 0x44e5, 0xba,0x8d, 0x0c,0x10,0x77,0xa6,0x2e,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("996b21bc-0386-44e5-ba8d-0c1077a62e92")
                IBadgeUpdateManagerForUser : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForApplication(
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForSecondaryTile(
                        HSTRING tile_id,
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_User(
                        ABI::Windows::System::IUser **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser, 0x996b21bc, 0x0386, 0x44e5, 0xba,0x8d, 0x0c,0x10,0x77,0xa6,0x2e,0x92)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUserVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        TrustLevel *trustLevel);

    /*** IBadgeUpdateManagerForUser methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        HSTRING tile_id,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUserVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeUpdateManagerForUser methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplication(This,result) (This)->lpVtbl->CreateBadgeUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateBadgeUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForSecondaryTile(This,tile_id,result) (This)->lpVtbl->CreateBadgeUpdaterForSecondaryTile(This,tile_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeUpdateManagerForUser methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,HSTRING tile_id,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForSecondaryTile(This,tile_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_get_User(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeUpdateManagerForUser IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser
#define IBadgeUpdateManagerForUserVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUserVtbl
#define IBadgeUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser
#define IBadgeUpdateManagerForUser_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_QueryInterface
#define IBadgeUpdateManagerForUser_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_AddRef
#define IBadgeUpdateManagerForUser_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_Release
#define IBadgeUpdateManagerForUser_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetIids
#define IBadgeUpdateManagerForUser_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetRuntimeClassName
#define IBadgeUpdateManagerForUser_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_GetTrustLevel
#define IBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplication
#define IBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForApplicationWithId
#define IBadgeUpdateManagerForUser_CreateBadgeUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_CreateBadgeUpdaterForSecondaryTile
#define IBadgeUpdateManagerForUser_get_User __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_get_User
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IBadgeUpdateManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics, 0x33400faa, 0x6dd5, 0x4105, 0xae,0xbc, 0x9b,0x50,0xfc,0xa4,0x92,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("33400faa-6dd5-4105-aebc-9b50fca492da")
                IBadgeUpdateManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForApplication(
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateBadgeUpdaterForSecondaryTile(
                        HSTRING tile_id,
                        ABI::Windows::UI::Notifications::IBadgeUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTemplateContent(
                        ABI::Windows::UI::Notifications::BadgeTemplateType type,
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics, 0x33400faa, 0x6dd5, 0x4105, 0xae,0xbc, 0x9b,0x50,0xfc,0xa4,0x92,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        TrustLevel *trustLevel);

    /*** IBadgeUpdateManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateBadgeUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        HSTRING tile_id,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result);

    HRESULT (STDMETHODCALLTYPE *GetTemplateContent)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType type,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeUpdateManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplication(This,result) (This)->lpVtbl->CreateBadgeUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateBadgeUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForSecondaryTile(This,tile_id,result) (This)->lpVtbl->CreateBadgeUpdaterForSecondaryTile(This,tile_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTemplateContent(This,type,result) (This)->lpVtbl->GetTemplateContent(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeUpdateManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,HSTRING tile_id,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater **result) {
    return This->lpVtbl->CreateBadgeUpdaterForSecondaryTile(This,tile_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTemplateContent(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CBadgeTemplateType type,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result) {
    return This->lpVtbl->GetTemplateContent(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeUpdateManagerStatics IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics
#define IBadgeUpdateManagerStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStaticsVtbl
#define IBadgeUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics
#define IBadgeUpdateManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_QueryInterface
#define IBadgeUpdateManagerStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_AddRef
#define IBadgeUpdateManagerStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_Release
#define IBadgeUpdateManagerStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetIids
#define IBadgeUpdateManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetRuntimeClassName
#define IBadgeUpdateManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTrustLevel
#define IBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplication
#define IBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForApplicationWithId
#define IBadgeUpdateManagerStatics_CreateBadgeUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_CreateBadgeUpdaterForSecondaryTile
#define IBadgeUpdateManagerStatics_GetTemplateContent __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_GetTemplateContent
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IBadgeUpdateManagerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2, 0x979a35ce, 0xf940, 0x48bf, 0x94,0xe8, 0xca,0x24,0x4d,0x40,0x0b,0x41);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("979a35ce-f940-48bf-94e8-ca244d400b41")
                IBadgeUpdateManagerStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForUser(
                        ABI::Windows::System::IUser *user,
                        ABI::Windows::UI::Notifications::IBadgeUpdateManagerForUser **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2, 0x979a35ce, 0xf940, 0x48bf, 0x94,0xe8, 0xca,0x24,0x4d,0x40,0x0b,0x41)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 *This,
        TrustLevel *trustLevel);

    /*** IBadgeUpdateManagerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForUser)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 *This,
        __x_ABI_CWindows_CSystem_CIUser *user,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeUpdateManagerStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetForUser(This,user,result) (This)->lpVtbl->GetForUser(This,user,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeUpdateManagerStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetForUser(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2* This,__x_ABI_CWindows_CSystem_CIUser *user,__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerForUser **result) {
    return This->lpVtbl->GetForUser(This,user,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeUpdateManagerStatics2 IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2
#define IBadgeUpdateManagerStatics2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2Vtbl
#define IBadgeUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2
#define IBadgeUpdateManagerStatics2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_QueryInterface
#define IBadgeUpdateManagerStatics2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_AddRef
#define IBadgeUpdateManagerStatics2_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_Release
#define IBadgeUpdateManagerStatics2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetIids
#define IBadgeUpdateManagerStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetRuntimeClassName
#define IBadgeUpdateManagerStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetTrustLevel
#define IBadgeUpdateManagerStatics2_GetForUser __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_GetForUser
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdateManagerStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IBadgeUpdater interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater, 0xb5fa1fd4, 0x7562, 0x4f6c, 0xbf,0xa3, 0x1b,0x6e,0xd2,0xe5,0x7f,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("b5fa1fd4-7562-4f6c-bfa3-1b6ed2e57f2f")
                IBadgeUpdater : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Update(
                        ABI::Windows::UI::Notifications::IBadgeNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdate(
                        ABI::Windows::Foundation::IUriRuntimeClass *badge_content,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateAtTime(
                        ABI::Windows::Foundation::IUriRuntimeClass *badge_content,
                        ABI::Windows::Foundation::DateTime start_time,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopPeriodicUpdate(
                        ) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater, 0xb5fa1fd4, 0x7562, 0x4f6c, 0xbf,0xa3, 0x1b,0x6e,0xd2,0xe5,0x7f,0x2f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdaterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        TrustLevel *trustLevel);

    /*** IBadgeUpdater methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *notification);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *badge_content,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateAtTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *badge_content,
        __x_ABI_CWindows_CFoundation_CDateTime start_time,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StopPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater *This);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdaterVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdaterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IBadgeUpdater methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Update(This,notification) (This)->lpVtbl->Update(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdate(This,badge_content,requested_interval) (This)->lpVtbl->StartPeriodicUpdate(This,badge_content,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdateAtTime(This,badge_content,start_time,requested_interval) (This)->lpVtbl->StartPeriodicUpdateAtTime(This,badge_content,start_time,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StopPeriodicUpdate(This) (This)->lpVtbl->StopPeriodicUpdate(This)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Release(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IBadgeUpdater methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Update(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CIBadgeNotification *notification) {
    return This->lpVtbl->Update(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Clear(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *badge_content,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdate(This,badge_content,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdateAtTime(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *badge_content,__x_ABI_CWindows_CFoundation_CDateTime start_time,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateAtTime(This,badge_content,start_time,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StopPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater* This) {
    return This->lpVtbl->StopPeriodicUpdate(This);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IBadgeUpdater IID___x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater
#define IBadgeUpdaterVtbl __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdaterVtbl
#define IBadgeUpdater __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater
#define IBadgeUpdater_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_QueryInterface
#define IBadgeUpdater_AddRef __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_AddRef
#define IBadgeUpdater_Release __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Release
#define IBadgeUpdater_GetIids __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetIids
#define IBadgeUpdater_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetRuntimeClassName
#define IBadgeUpdater_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_GetTrustLevel
#define IBadgeUpdater_Update __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Update
#define IBadgeUpdater_Clear __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_Clear
#define IBadgeUpdater_StartPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdate
#define IBadgeUpdater_StartPeriodicUpdateAtTime __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StartPeriodicUpdateAtTime
#define IBadgeUpdater_StopPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_StopPeriodicUpdate
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIBadgeUpdater_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IKnownAdaptiveNotificationHintsStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics, 0x06206598, 0xd496, 0x497d, 0x86,0x92, 0x4f,0x7d,0x7c,0x27,0x70,0xdf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("06206598-d496-497d-8692-4f7d7c2770df")
                IKnownAdaptiveNotificationHintsStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Style(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Wrap(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaxLines(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MinLines(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TextStacking(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Align(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics, 0x06206598, 0xd496, 0x497d, 0x86,0x92, 0x4f,0x7d,0x7c,0x27,0x70,0xdf)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        TrustLevel *trustLevel);

    /*** IKnownAdaptiveNotificationHintsStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Style)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Wrap)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_MaxLines)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_MinLines)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_TextStacking)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Align)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKnownAdaptiveNotificationHintsStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Style(This,value) (This)->lpVtbl->get_Style(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Wrap(This,value) (This)->lpVtbl->get_Wrap(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MaxLines(This,value) (This)->lpVtbl->get_MaxLines(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MinLines(This,value) (This)->lpVtbl->get_MinLines(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_TextStacking(This,value) (This)->lpVtbl->get_TextStacking(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Align(This,value) (This)->lpVtbl->get_Align(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKnownAdaptiveNotificationHintsStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Style(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Style(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Wrap(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Wrap(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MaxLines(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_MaxLines(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MinLines(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_MinLines(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_TextStacking(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_TextStacking(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Align(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Align(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IKnownAdaptiveNotificationHintsStatics IID___x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics
#define IKnownAdaptiveNotificationHintsStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStaticsVtbl
#define IKnownAdaptiveNotificationHintsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics
#define IKnownAdaptiveNotificationHintsStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_QueryInterface
#define IKnownAdaptiveNotificationHintsStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_AddRef
#define IKnownAdaptiveNotificationHintsStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_Release
#define IKnownAdaptiveNotificationHintsStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetIids
#define IKnownAdaptiveNotificationHintsStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetRuntimeClassName
#define IKnownAdaptiveNotificationHintsStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_GetTrustLevel
#define IKnownAdaptiveNotificationHintsStatics_get_Style __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Style
#define IKnownAdaptiveNotificationHintsStatics_get_Wrap __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Wrap
#define IKnownAdaptiveNotificationHintsStatics_get_MaxLines __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MaxLines
#define IKnownAdaptiveNotificationHintsStatics_get_MinLines __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_MinLines
#define IKnownAdaptiveNotificationHintsStatics_get_TextStacking __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_TextStacking
#define IKnownAdaptiveNotificationHintsStatics_get_Align __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_get_Align
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationHintsStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IKnownAdaptiveNotificationTextStylesStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics, 0x202192d7, 0x8996, 0x45aa, 0x8b,0xa1, 0xd4,0x61,0xd7,0x2c,0x2a,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("202192d7-8996-45aa-8ba1-d461d72c2a1b")
                IKnownAdaptiveNotificationTextStylesStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Caption(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Body(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Base(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Subtitle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Title(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Subheader(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Header(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TitleNumeral(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SubheaderNumeral(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HeaderNumeral(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CaptionSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BodySubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_BaseSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SubtitleSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_TitleSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SubheaderSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SubheaderNumeralSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HeaderSubtle(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_HeaderNumeralSubtle(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics, 0x202192d7, 0x8996, 0x45aa, 0x8b,0xa1, 0xd4,0x61,0xd7,0x2c,0x2a,0x1b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        TrustLevel *trustLevel);

    /*** IKnownAdaptiveNotificationTextStylesStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Caption)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Body)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Base)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Subtitle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Title)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Subheader)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Header)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_TitleNumeral)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SubheaderNumeral)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_HeaderNumeral)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_CaptionSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_BodySubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_BaseSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SubtitleSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_TitleSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SubheaderSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_SubheaderNumeralSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_HeaderSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_HeaderNumeralSubtle)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKnownAdaptiveNotificationTextStylesStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Caption(This,value) (This)->lpVtbl->get_Caption(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Body(This,value) (This)->lpVtbl->get_Body(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Base(This,value) (This)->lpVtbl->get_Base(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subtitle(This,value) (This)->lpVtbl->get_Subtitle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Title(This,value) (This)->lpVtbl->get_Title(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subheader(This,value) (This)->lpVtbl->get_Subheader(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Header(This,value) (This)->lpVtbl->get_Header(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleNumeral(This,value) (This)->lpVtbl->get_TitleNumeral(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeral(This,value) (This)->lpVtbl->get_SubheaderNumeral(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeral(This,value) (This)->lpVtbl->get_HeaderNumeral(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_CaptionSubtle(This,value) (This)->lpVtbl->get_CaptionSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BodySubtle(This,value) (This)->lpVtbl->get_BodySubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BaseSubtle(This,value) (This)->lpVtbl->get_BaseSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubtitleSubtle(This,value) (This)->lpVtbl->get_SubtitleSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleSubtle(This,value) (This)->lpVtbl->get_TitleSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderSubtle(This,value) (This)->lpVtbl->get_SubheaderSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeralSubtle(This,value) (This)->lpVtbl->get_SubheaderNumeralSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderSubtle(This,value) (This)->lpVtbl->get_HeaderSubtle(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeralSubtle(This,value) (This)->lpVtbl->get_HeaderNumeralSubtle(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKnownAdaptiveNotificationTextStylesStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Caption(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Caption(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Body(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Body(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Base(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Base(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subtitle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Subtitle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Title(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Title(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subheader(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Subheader(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Header(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_Header(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleNumeral(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_TitleNumeral(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeral(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_SubheaderNumeral(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeral(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_HeaderNumeral(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_CaptionSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_CaptionSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BodySubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_BodySubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BaseSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_BaseSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubtitleSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_SubtitleSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_TitleSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_SubheaderSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeralSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_SubheaderNumeralSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_HeaderSubtle(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeralSubtle(__x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics* This,HSTRING *value) {
    return This->lpVtbl->get_HeaderNumeralSubtle(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IKnownAdaptiveNotificationTextStylesStatics IID___x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics
#define IKnownAdaptiveNotificationTextStylesStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStaticsVtbl
#define IKnownAdaptiveNotificationTextStylesStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics
#define IKnownAdaptiveNotificationTextStylesStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_QueryInterface
#define IKnownAdaptiveNotificationTextStylesStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_AddRef
#define IKnownAdaptiveNotificationTextStylesStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_Release
#define IKnownAdaptiveNotificationTextStylesStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetIids
#define IKnownAdaptiveNotificationTextStylesStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetRuntimeClassName
#define IKnownAdaptiveNotificationTextStylesStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_GetTrustLevel
#define IKnownAdaptiveNotificationTextStylesStatics_get_Caption __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Caption
#define IKnownAdaptiveNotificationTextStylesStatics_get_Body __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Body
#define IKnownAdaptiveNotificationTextStylesStatics_get_Base __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Base
#define IKnownAdaptiveNotificationTextStylesStatics_get_Subtitle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subtitle
#define IKnownAdaptiveNotificationTextStylesStatics_get_Title __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Title
#define IKnownAdaptiveNotificationTextStylesStatics_get_Subheader __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Subheader
#define IKnownAdaptiveNotificationTextStylesStatics_get_Header __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_Header
#define IKnownAdaptiveNotificationTextStylesStatics_get_TitleNumeral __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleNumeral
#define IKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeral __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeral
#define IKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeral __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeral
#define IKnownAdaptiveNotificationTextStylesStatics_get_CaptionSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_CaptionSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_BodySubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BodySubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_BaseSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_BaseSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_SubtitleSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubtitleSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_TitleSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_TitleSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_SubheaderSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeralSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_SubheaderNumeralSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_HeaderSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderSubtle
#define IKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeralSubtle __x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_get_HeaderNumeralSubtle
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIKnownAdaptiveNotificationTextStylesStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IKnownNotificationBindingsStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics, 0x79427bae, 0xa8b7, 0x4d58, 0x89,0xea, 0x76,0xa7,0xb7,0xbc,0xcd,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("79427bae-a8b7-4d58-89ea-76a7b7bccded")
                IKnownNotificationBindingsStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ToastGeneric(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics, 0x79427bae, 0xa8b7, 0x4d58, 0x89,0xea, 0x76,0xa7,0xb7,0xbc,0xcd,0xed)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics *This,
        TrustLevel *trustLevel);

    /*** IKnownNotificationBindingsStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ToastGeneric)(
        __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IKnownNotificationBindingsStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_get_ToastGeneric(This,value) (This)->lpVtbl->get_ToastGeneric(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IKnownNotificationBindingsStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_get_ToastGeneric(__x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics* This,HSTRING *value) {
    return This->lpVtbl->get_ToastGeneric(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IKnownNotificationBindingsStatics IID___x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics
#define IKnownNotificationBindingsStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStaticsVtbl
#define IKnownNotificationBindingsStatics __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics
#define IKnownNotificationBindingsStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_QueryInterface
#define IKnownNotificationBindingsStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_AddRef
#define IKnownNotificationBindingsStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_Release
#define IKnownNotificationBindingsStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetIids
#define IKnownNotificationBindingsStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetRuntimeClassName
#define IKnownNotificationBindingsStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_GetTrustLevel
#define IKnownNotificationBindingsStatics_get_ToastGeneric __x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_get_ToastGeneric
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIKnownNotificationBindingsStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * INotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotification, 0x108037fe, 0xeb76, 0x4f82, 0x97,0xbc, 0xda,0x07,0x53,0x0a,0x2e,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("108037fe-eb76-4f82-97bc-da07530a2e20")
                INotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Visual(
                        ABI::Windows::UI::Notifications::INotificationVisual **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Visual(
                        ABI::Windows::UI::Notifications::INotificationVisual *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotification, 0x108037fe, 0xeb76, 0x4f82, 0x97,0xbc, 0xda,0x07,0x53,0x0a,0x2e,0x20)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        TrustLevel *trustLevel);

    /*** INotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_Visual)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual **value);

    HRESULT (STDMETHODCALLTYPE *put_Visual)(
        __x_ABI_CWindows_CUI_CNotifications_CINotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_get_Visual(This,value) (This)->lpVtbl->get_Visual(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotification_put_Visual(This,value) (This)->lpVtbl->put_Visual(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotification_Release(__x_ABI_CWindows_CUI_CNotifications_CINotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_get_Visual(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual **value) {
    return This->lpVtbl->get_Visual(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotification_put_Visual(__x_ABI_CWindows_CUI_CNotifications_CINotification* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *value) {
    return This->lpVtbl->put_Visual(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotification IID___x_ABI_CWindows_CUI_CNotifications_CINotification
#define INotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationVtbl
#define INotification __x_ABI_CWindows_CUI_CNotifications_CINotification
#define INotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotification_QueryInterface
#define INotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotification_AddRef
#define INotification_Release __x_ABI_CWindows_CUI_CNotifications_CINotification_Release
#define INotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotification_GetIids
#define INotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotification_GetRuntimeClassName
#define INotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotification_GetTrustLevel
#define INotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CINotification_get_ExpirationTime
#define INotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CINotification_put_ExpirationTime
#define INotification_get_Visual __x_ABI_CWindows_CUI_CNotifications_CINotification_get_Visual
#define INotification_put_Visual __x_ABI_CWindows_CUI_CNotifications_CINotification_put_Visual
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * INotificationBinding interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotificationBinding, 0xf29e4b85, 0x0370, 0x4ad3, 0xb4,0xea, 0xda,0x9e,0x35,0xe7,0xea,0xbf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("f29e4b85-0370-4ad3-b4ea-da9e35e7eabf")
                INotificationBinding : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Template(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Template(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Language(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Language(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Hints(
                        ABI::Windows::Foundation::Collections::IMap<HSTRING,HSTRING > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTextElements(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding, 0xf29e4b85, 0x0370, 0x4ad3, 0xb4,0xea, 0xda,0x9e,0x35,0xe7,0xea,0xbf)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationBindingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        TrustLevel *trustLevel);

    /*** INotificationBinding methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Template)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Template)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Hints)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        __FIMap_2_HSTRING_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *GetTextElements)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationBindingVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotificationBinding methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Template(This,value) (This)->lpVtbl->get_Template(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Template(This,value) (This)->lpVtbl->put_Template(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Language(This,value) (This)->lpVtbl->get_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Language(This,value) (This)->lpVtbl->put_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Hints(This,value) (This)->lpVtbl->get_Hints(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTextElements(This,result) (This)->lpVtbl->GetTextElements(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_Release(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotificationBinding methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Template(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING *value) {
    return This->lpVtbl->get_Template(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Template(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING value) {
    return This->lpVtbl->put_Template(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Language(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING *value) {
    return This->lpVtbl->get_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Language(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,HSTRING value) {
    return This->lpVtbl->put_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Hints(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,__FIMap_2_HSTRING_HSTRING **value) {
    return This->lpVtbl->get_Hints(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTextElements(__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding* This,__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText **result) {
    return This->lpVtbl->GetTextElements(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotificationBinding IID___x_ABI_CWindows_CUI_CNotifications_CINotificationBinding
#define INotificationBindingVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationBindingVtbl
#define INotificationBinding __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding
#define INotificationBinding_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_QueryInterface
#define INotificationBinding_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_AddRef
#define INotificationBinding_Release __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_Release
#define INotificationBinding_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetIids
#define INotificationBinding_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetRuntimeClassName
#define INotificationBinding_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTrustLevel
#define INotificationBinding_get_Template __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Template
#define INotificationBinding_put_Template __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Template
#define INotificationBinding_get_Language __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Language
#define INotificationBinding_put_Language __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_put_Language
#define INotificationBinding_get_Hints __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_get_Hints
#define INotificationBinding_GetTextElements __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_GetTextElements
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotificationBinding_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * INotificationData interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotificationData, 0x9ffd2312, 0x9d6a, 0x4aaf, 0xb6,0xac, 0xff,0x17,0xf0,0xc1,0xf2,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("9ffd2312-9d6a-4aaf-b6ac-ff17f0c1f280")
                INotificationData : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Values(
                        ABI::Windows::Foundation::Collections::IMap<HSTRING,HSTRING > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SequenceNumber(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SequenceNumber(
                        UINT32 value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotificationData, 0x9ffd2312, 0x9d6a, 0x4aaf, 0xb6,0xac, 0xff,0x17,0xf0,0xc1,0xf2,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        TrustLevel *trustLevel);

    /*** INotificationData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Values)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        __FIMap_2_HSTRING_HSTRING **value);

    HRESULT (STDMETHODCALLTYPE *get_SequenceNumber)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_SequenceNumber)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *This,
        UINT32 value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationDataVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotificationData {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotificationData methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_Values(This,value) (This)->lpVtbl->get_Values(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_SequenceNumber(This,value) (This)->lpVtbl->get_SequenceNumber(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationData_put_SequenceNumber(This,value) (This)->lpVtbl->put_SequenceNumber(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationData_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationData_Release(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotificationData methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_Values(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,__FIMap_2_HSTRING_HSTRING **value) {
    return This->lpVtbl->get_Values(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_SequenceNumber(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,UINT32 *value) {
    return This->lpVtbl->get_SequenceNumber(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationData_put_SequenceNumber(__x_ABI_CWindows_CUI_CNotifications_CINotificationData* This,UINT32 value) {
    return This->lpVtbl->put_SequenceNumber(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotificationData IID___x_ABI_CWindows_CUI_CNotifications_CINotificationData
#define INotificationDataVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationDataVtbl
#define INotificationData __x_ABI_CWindows_CUI_CNotifications_CINotificationData
#define INotificationData_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotificationData_QueryInterface
#define INotificationData_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotificationData_AddRef
#define INotificationData_Release __x_ABI_CWindows_CUI_CNotifications_CINotificationData_Release
#define INotificationData_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetIids
#define INotificationData_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetRuntimeClassName
#define INotificationData_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotificationData_GetTrustLevel
#define INotificationData_get_Values __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_Values
#define INotificationData_get_SequenceNumber __x_ABI_CWindows_CUI_CNotifications_CINotificationData_get_SequenceNumber
#define INotificationData_put_SequenceNumber __x_ABI_CWindows_CUI_CNotifications_CINotificationData_put_SequenceNumber
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotificationData_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * INotificationDataFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory, 0x23c1e33a, 0x1c10, 0x46fb, 0x80,0x40, 0xde,0xc3,0x84,0x62,0x1c,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("23c1e33a-1c10-46fb-8040-dec384621cf8")
                INotificationDataFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateNotificationDataWithValuesAndSequenceNumber(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > *initial_values,
                        UINT32 sequence_number,
                        ABI::Windows::UI::Notifications::INotificationData **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateNotificationDataWithValues(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Collections::IKeyValuePair<HSTRING,HSTRING >* > *initial_values,
                        ABI::Windows::UI::Notifications::INotificationData **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory, 0x23c1e33a, 0x1c10, 0x46fb, 0x80,0x40, 0xde,0xc3,0x84,0x62,0x1c,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This,
        TrustLevel *trustLevel);

    /*** INotificationDataFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateNotificationDataWithValuesAndSequenceNumber)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This,
        __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *initial_values,
        UINT32 sequence_number,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData **value);

    HRESULT (STDMETHODCALLTYPE *CreateNotificationDataWithValues)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory *This,
        __FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *initial_values,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotificationDataFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValuesAndSequenceNumber(This,initial_values,sequence_number,value) (This)->lpVtbl->CreateNotificationDataWithValuesAndSequenceNumber(This,initial_values,sequence_number,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValues(This,initial_values,value) (This)->lpVtbl->CreateNotificationDataWithValues(This,initial_values,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotificationDataFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValuesAndSequenceNumber(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *initial_values,UINT32 sequence_number,__x_ABI_CWindows_CUI_CNotifications_CINotificationData **value) {
    return This->lpVtbl->CreateNotificationDataWithValuesAndSequenceNumber(This,initial_values,sequence_number,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValues(__x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory* This,__FIIterable_1___FIKeyValuePair_2_HSTRING_HSTRING *initial_values,__x_ABI_CWindows_CUI_CNotifications_CINotificationData **value) {
    return This->lpVtbl->CreateNotificationDataWithValues(This,initial_values,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotificationDataFactory IID___x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory
#define INotificationDataFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactoryVtbl
#define INotificationDataFactory __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory
#define INotificationDataFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_QueryInterface
#define INotificationDataFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_AddRef
#define INotificationDataFactory_Release __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_Release
#define INotificationDataFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetIids
#define INotificationDataFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetRuntimeClassName
#define INotificationDataFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_GetTrustLevel
#define INotificationDataFactory_CreateNotificationDataWithValuesAndSequenceNumber __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValuesAndSequenceNumber
#define INotificationDataFactory_CreateNotificationDataWithValues __x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_CreateNotificationDataWithValues
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotificationDataFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * INotificationVisual interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CINotificationVisual, 0x68835b8e, 0xaa56, 0x4e11, 0x86,0xd3, 0x5f,0x9a,0x69,0x57,0xbc,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("68835b8e-aa56-4e11-86d3-5f9a6957bc5b")
                INotificationVisual : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Language(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Language(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Bindings(
                        ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Notifications::NotificationBinding* > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetBinding(
                        HSTRING template_name,
                        ABI::Windows::UI::Notifications::INotificationBinding **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual, 0x68835b8e, 0xaa56, 0x4e11, 0x86,0xd3, 0x5f,0x9a,0x69,0x57,0xbc,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CINotificationVisualVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        TrustLevel *trustLevel);

    /*** INotificationVisual methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Language)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Bindings)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *GetBinding)(
        __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual *This,
        HSTRING template_name,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CINotificationVisualVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CINotificationVisualVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** INotificationVisual methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Language(This,value) (This)->lpVtbl->get_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_put_Language(This,value) (This)->lpVtbl->put_Language(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Bindings(This,value) (This)->lpVtbl->get_Bindings(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetBinding(This,template_name,result) (This)->lpVtbl->GetBinding(This,template_name,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_AddRef(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_Release(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetIids(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** INotificationVisual methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Language(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,HSTRING *value) {
    return This->lpVtbl->get_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_put_Language(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,HSTRING value) {
    return This->lpVtbl->put_Language(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Bindings(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding **value) {
    return This->lpVtbl->get_Bindings(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetBinding(__x_ABI_CWindows_CUI_CNotifications_CINotificationVisual* This,HSTRING template_name,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **result) {
    return This->lpVtbl->GetBinding(This,template_name,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_INotificationVisual IID___x_ABI_CWindows_CUI_CNotifications_CINotificationVisual
#define INotificationVisualVtbl __x_ABI_CWindows_CUI_CNotifications_CINotificationVisualVtbl
#define INotificationVisual __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual
#define INotificationVisual_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_QueryInterface
#define INotificationVisual_AddRef __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_AddRef
#define INotificationVisual_Release __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_Release
#define INotificationVisual_GetIids __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetIids
#define INotificationVisual_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetRuntimeClassName
#define INotificationVisual_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetTrustLevel
#define INotificationVisual_get_Language __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Language
#define INotificationVisual_put_Language __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_put_Language
#define INotificationVisual_get_Bindings __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_get_Bindings
#define INotificationVisual_GetBinding __x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_GetBinding
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CINotificationVisual_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IScheduledTileNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification, 0x0abca6d5, 0x99dc, 0x4c78, 0xa1,0x1c, 0xc9,0xe7,0xf8,0x6d,0x7e,0xf7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("0abca6d5-99dc-4c78-a11c-c9e7f86d7ef7")
                IScheduledTileNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DeliveryTime(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Id(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification, 0x0abca6d5, 0x99dc, 0x4c78, 0xa1,0x1c, 0xc9,0xe7,0xf8,0x6d,0x7e,0xf7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        TrustLevel *trustLevel);

    /*** IScheduledTileNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *get_DeliveryTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledTileNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_DeliveryTime(This,value) (This)->lpVtbl->get_DeliveryTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Id(This,value) (This)->lpVtbl->put_Id(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledTileNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_DeliveryTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_DeliveryTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Tag(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Tag(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Id(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING value) {
    return This->lpVtbl->put_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Id(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Id(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledTileNotification IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification
#define IScheduledTileNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationVtbl
#define IScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification
#define IScheduledTileNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_QueryInterface
#define IScheduledTileNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_AddRef
#define IScheduledTileNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_Release
#define IScheduledTileNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetIids
#define IScheduledTileNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetRuntimeClassName
#define IScheduledTileNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_GetTrustLevel
#define IScheduledTileNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Content
#define IScheduledTileNotification_get_DeliveryTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_DeliveryTime
#define IScheduledTileNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_ExpirationTime
#define IScheduledTileNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_ExpirationTime
#define IScheduledTileNotification_put_Tag __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Tag
#define IScheduledTileNotification_get_Tag __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Tag
#define IScheduledTileNotification_put_Id __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_put_Id
#define IScheduledTileNotification_get_Id __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_get_Id
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IScheduledTileNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory, 0x3383138a, 0x98c0, 0x4c3b, 0xbb,0xd6, 0x4a,0x63,0x3c,0x7c,0xfc,0x29);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("3383138a-98c0-4c3b-bbd6-4a633c7cfc29")
                IScheduledTileNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateScheduledTileNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::Foundation::DateTime delivery_time,
                        ABI::Windows::UI::Notifications::IScheduledTileNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory, 0x3383138a, 0x98c0, 0x4c3b, 0xbb,0xd6, 0x4a,0x63,0x3c,0x7c,0xfc,0x29)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory *This,
        TrustLevel *trustLevel);

    /*** IScheduledTileNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateScheduledTileNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CFoundation_CDateTime delivery_time,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledTileNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_CreateScheduledTileNotification(This,content,delivery_time,value) (This)->lpVtbl->CreateScheduledTileNotification(This,content,delivery_time,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledTileNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_CreateScheduledTileNotification(__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CFoundation_CDateTime delivery_time,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value) {
    return This->lpVtbl->CreateScheduledTileNotification(This,content,delivery_time,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledTileNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory
#define IScheduledTileNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactoryVtbl
#define IScheduledTileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory
#define IScheduledTileNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_QueryInterface
#define IScheduledTileNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_AddRef
#define IScheduledTileNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_Release
#define IScheduledTileNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetIids
#define IScheduledTileNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetRuntimeClassName
#define IScheduledTileNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_GetTrustLevel
#define IScheduledTileNotificationFactory_CreateScheduledTileNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_CreateScheduledTileNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotificationFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IScheduledToastNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification, 0x79f577f8, 0x0de7, 0x48cd, 0x97,0x40, 0x9b,0x37,0x04,0x90,0xc8,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("79f577f8-0de7-48cd-9740-9b370490c838")
                IScheduledToastNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DeliveryTime(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SnoozeInterval(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::TimeSpan > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_MaximumSnoozeCount(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Id(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification, 0x79f577f8, 0x0de7, 0x48cd, 0x97,0x40, 0x9b,0x37,0x04,0x90,0xc8,0x38)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        TrustLevel *trustLevel);

    /*** IScheduledToastNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *get_DeliveryTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_SnoozeInterval)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        __FIReference_1_TimeSpan **value);

    HRESULT (STDMETHODCALLTYPE *get_MaximumSnoozeCount)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_DeliveryTime(This,value) (This)->lpVtbl->get_DeliveryTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_SnoozeInterval(This,value) (This)->lpVtbl->get_SnoozeInterval(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_MaximumSnoozeCount(This,value) (This)->lpVtbl->get_MaximumSnoozeCount(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_put_Id(This,value) (This)->lpVtbl->put_Id(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_DeliveryTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_DeliveryTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_SnoozeInterval(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,__FIReference_1_TimeSpan **value) {
    return This->lpVtbl->get_SnoozeInterval(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_MaximumSnoozeCount(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,UINT32 *value) {
    return This->lpVtbl->get_MaximumSnoozeCount(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_put_Id(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,HSTRING value) {
    return This->lpVtbl->put_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Id(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Id(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotification IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification
#define IScheduledToastNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationVtbl
#define IScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification
#define IScheduledToastNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_QueryInterface
#define IScheduledToastNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_AddRef
#define IScheduledToastNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_Release
#define IScheduledToastNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetIids
#define IScheduledToastNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetRuntimeClassName
#define IScheduledToastNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_GetTrustLevel
#define IScheduledToastNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Content
#define IScheduledToastNotification_get_DeliveryTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_DeliveryTime
#define IScheduledToastNotification_get_SnoozeInterval __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_SnoozeInterval
#define IScheduledToastNotification_get_MaximumSnoozeCount __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_MaximumSnoozeCount
#define IScheduledToastNotification_put_Id __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_put_Id
#define IScheduledToastNotification_get_Id __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_get_Id
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IScheduledToastNotification2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2, 0xa66ea09c, 0x31b4, 0x43b0, 0xb5,0xdd, 0x7a,0x40,0xe8,0x53,0x63,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("a66ea09c-31b4-43b0-b5dd-7a40e85363b1")
                IScheduledToastNotification2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Group(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Group(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SuppressPopup(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SuppressPopup(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2, 0xa66ea09c, 0x31b4, 0x43b0, 0xb5,0xdd, 0x7a,0x40,0xe8,0x53,0x63,0xb1)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        TrustLevel *trustLevel);

    /*** IScheduledToastNotification2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Group)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Group)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_SuppressPopup)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_SuppressPopup)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotification2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Group(This,value) (This)->lpVtbl->put_Group(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Group(This,value) (This)->lpVtbl->get_Group(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_SuppressPopup(This,value) (This)->lpVtbl->put_SuppressPopup(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_SuppressPopup(This,value) (This)->lpVtbl->get_SuppressPopup(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotification2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Tag(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Tag(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Group(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING value) {
    return This->lpVtbl->put_Group(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Group(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,HSTRING *value) {
    return This->lpVtbl->get_Group(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_SuppressPopup(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,boolean value) {
    return This->lpVtbl->put_SuppressPopup(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_SuppressPopup(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2* This,boolean *value) {
    return This->lpVtbl->get_SuppressPopup(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotification2 IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2
#define IScheduledToastNotification2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2Vtbl
#define IScheduledToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2
#define IScheduledToastNotification2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_QueryInterface
#define IScheduledToastNotification2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_AddRef
#define IScheduledToastNotification2_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_Release
#define IScheduledToastNotification2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetIids
#define IScheduledToastNotification2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetRuntimeClassName
#define IScheduledToastNotification2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_GetTrustLevel
#define IScheduledToastNotification2_put_Tag __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Tag
#define IScheduledToastNotification2_get_Tag __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Tag
#define IScheduledToastNotification2_put_Group __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_Group
#define IScheduledToastNotification2_get_Group __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_Group
#define IScheduledToastNotification2_put_SuppressPopup __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_put_SuppressPopup
#define IScheduledToastNotification2_get_SuppressPopup __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_get_SuppressPopup
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IScheduledToastNotification3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3, 0x98429e8b, 0xbd32, 0x4a3b, 0x9d,0x15, 0x22,0xae,0xa4,0x94,0x62,0xa1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("98429e8b-bd32-4a3b-9d15-22aea49462a1")
                IScheduledToastNotification3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_NotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RemoteId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RemoteId(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3, 0x98429e8b, 0xbd32, 0x4a3b, 0x9d,0x15, 0x22,0xae,0xa4,0x94,0x62,0xa1)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        TrustLevel *trustLevel);

    /*** IScheduledToastNotification3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring *value);

    HRESULT (STDMETHODCALLTYPE *put_NotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value);

    HRESULT (STDMETHODCALLTYPE *get_RemoteId)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_RemoteId)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotification3 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_NotificationMirroring(This,value) (This)->lpVtbl->get_NotificationMirroring(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_NotificationMirroring(This,value) (This)->lpVtbl->put_NotificationMirroring(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_RemoteId(This,value) (This)->lpVtbl->get_RemoteId(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_RemoteId(This,value) (This)->lpVtbl->put_RemoteId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotification3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_NotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring *value) {
    return This->lpVtbl->get_NotificationMirroring(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_NotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value) {
    return This->lpVtbl->put_NotificationMirroring(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_RemoteId(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,HSTRING *value) {
    return This->lpVtbl->get_RemoteId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_RemoteId(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3* This,HSTRING value) {
    return This->lpVtbl->put_RemoteId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotification3 IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3
#define IScheduledToastNotification3Vtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3Vtbl
#define IScheduledToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3
#define IScheduledToastNotification3_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_QueryInterface
#define IScheduledToastNotification3_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_AddRef
#define IScheduledToastNotification3_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_Release
#define IScheduledToastNotification3_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetIids
#define IScheduledToastNotification3_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetRuntimeClassName
#define IScheduledToastNotification3_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_GetTrustLevel
#define IScheduledToastNotification3_get_NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_NotificationMirroring
#define IScheduledToastNotification3_put_NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_NotificationMirroring
#define IScheduledToastNotification3_get_RemoteId __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_get_RemoteId
#define IScheduledToastNotification3_put_RemoteId __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_put_RemoteId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IScheduledToastNotification4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4, 0x1d4761fd, 0xbdef, 0x4e4a, 0x96,0xbe, 0x01,0x01,0x36,0x9b,0x58,0xd2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("1d4761fd-bdef-4e4a-96be-0101369b58d2")
                IScheduledToastNotification4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4, 0x1d4761fd, 0xbdef, 0x4e4a, 0x96,0xbe, 0x01,0x01,0x36,0x9b,0x58,0xd2)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This,
        TrustLevel *trustLevel);

    /*** IScheduledToastNotification4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 *This,
        __FIReference_1_DateTime *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotification4 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotification4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotification4 IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4
#define IScheduledToastNotification4Vtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4Vtbl
#define IScheduledToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4
#define IScheduledToastNotification4_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_QueryInterface
#define IScheduledToastNotification4_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_AddRef
#define IScheduledToastNotification4_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_Release
#define IScheduledToastNotification4_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetIids
#define IScheduledToastNotification4_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetRuntimeClassName
#define IScheduledToastNotification4_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_GetTrustLevel
#define IScheduledToastNotification4_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_get_ExpirationTime
#define IScheduledToastNotification4_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_put_ExpirationTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x60000 */

/*****************************************************************************
 * IScheduledToastNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory, 0xe7bed191, 0x0bb9, 0x4189, 0x83,0x94, 0x31,0x76,0x1b,0x47,0x6f,0xd7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("e7bed191-0bb9-4189-8394-31761b476fd7")
                IScheduledToastNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateScheduledToastNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::Foundation::DateTime delivery_time,
                        ABI::Windows::UI::Notifications::IScheduledToastNotification **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateScheduledToastNotificationRecurring(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::Foundation::DateTime delivery_time,
                        ABI::Windows::Foundation::TimeSpan snooze_interval,
                        UINT32 maximum_snooze_count,
                        ABI::Windows::UI::Notifications::IScheduledToastNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory, 0xe7bed191, 0x0bb9, 0x4189, 0x83,0x94, 0x31,0x76,0x1b,0x47,0x6f,0xd7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This,
        TrustLevel *trustLevel);

    /*** IScheduledToastNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateScheduledToastNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CFoundation_CDateTime delivery_time,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *CreateScheduledToastNotificationRecurring)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CFoundation_CDateTime delivery_time,
        __x_ABI_CWindows_CFoundation_CTimeSpan snooze_interval,
        UINT32 maximum_snooze_count,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotification(This,content,delivery_time,value) (This)->lpVtbl->CreateScheduledToastNotification(This,content,delivery_time,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotificationRecurring(This,content,delivery_time,snooze_interval,maximum_snooze_count,value) (This)->lpVtbl->CreateScheduledToastNotificationRecurring(This,content,delivery_time,snooze_interval,maximum_snooze_count,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotification(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CFoundation_CDateTime delivery_time,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->CreateScheduledToastNotification(This,content,delivery_time,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotificationRecurring(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CFoundation_CDateTime delivery_time,__x_ABI_CWindows_CFoundation_CTimeSpan snooze_interval,UINT32 maximum_snooze_count,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->CreateScheduledToastNotificationRecurring(This,content,delivery_time,snooze_interval,maximum_snooze_count,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory
#define IScheduledToastNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactoryVtbl
#define IScheduledToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory
#define IScheduledToastNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_QueryInterface
#define IScheduledToastNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_AddRef
#define IScheduledToastNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_Release
#define IScheduledToastNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetIids
#define IScheduledToastNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetRuntimeClassName
#define IScheduledToastNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_GetTrustLevel
#define IScheduledToastNotificationFactory_CreateScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotification
#define IScheduledToastNotificationFactory_CreateScheduledToastNotificationRecurring __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_CreateScheduledToastNotificationRecurring
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IScheduledToastNotificationShowingEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs, 0x6173f6b4, 0x412a, 0x5e2c, 0xa6,0xed, 0xa0,0x20,0x9a,0xef,0x9a,0x09);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("6173f6b4-412a-5e2c-a6ed-a0209aef9a09")
                IScheduledToastNotificationShowingEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Cancel(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Cancel(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ScheduledToastNotification(
                        ABI::Windows::UI::Notifications::IScheduledToastNotification **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetDeferral(
                        ABI::Windows::Foundation::IDeferral **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs, 0x6173f6b4, 0x412a, 0x5e2c, 0xa6,0xed, 0xa0,0x20,0x9a,0xef,0x9a,0x09)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        TrustLevel *trustLevel);

    /*** IScheduledToastNotificationShowingEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Cancel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_Cancel)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ScheduledToastNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *GetDeferral)(
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *This,
        __x_ABI_CWindows_CFoundation_CIDeferral **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IScheduledToastNotificationShowingEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_Cancel(This,value) (This)->lpVtbl->get_Cancel(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_put_Cancel(This,value) (This)->lpVtbl->put_Cancel(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_ScheduledToastNotification(This,value) (This)->lpVtbl->get_ScheduledToastNotification(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetDeferral(This,result) (This)->lpVtbl->GetDeferral(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IScheduledToastNotificationShowingEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_Cancel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,boolean *value) {
    return This->lpVtbl->get_Cancel(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_put_Cancel(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,boolean value) {
    return This->lpVtbl->put_Cancel(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_ScheduledToastNotification(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->get_ScheduledToastNotification(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetDeferral(__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs* This,__x_ABI_CWindows_CFoundation_CIDeferral **result) {
    return This->lpVtbl->GetDeferral(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IScheduledToastNotificationShowingEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs
#define IScheduledToastNotificationShowingEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgsVtbl
#define IScheduledToastNotificationShowingEventArgs __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs
#define IScheduledToastNotificationShowingEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_QueryInterface
#define IScheduledToastNotificationShowingEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_AddRef
#define IScheduledToastNotificationShowingEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_Release
#define IScheduledToastNotificationShowingEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetIids
#define IScheduledToastNotificationShowingEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetRuntimeClassName
#define IScheduledToastNotificationShowingEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetTrustLevel
#define IScheduledToastNotificationShowingEventArgs_get_Cancel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_Cancel
#define IScheduledToastNotificationShowingEventArgs_put_Cancel __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_put_Cancel
#define IScheduledToastNotificationShowingEventArgs_get_ScheduledToastNotification __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_get_ScheduledToastNotification
#define IScheduledToastNotificationShowingEventArgs_GetDeferral __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_GetDeferral
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IShownTileNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification, 0x342d8988, 0x5af2, 0x481a, 0xa6,0xa3, 0xf2,0xfd,0xc7,0x8d,0xe8,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("342d8988-5af2-481a-a6a3-f2fdc78de88e")
                IShownTileNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Arguments(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification, 0x342d8988, 0x5af2, 0x481a, 0xa6,0xa3, 0xf2,0xfd,0xc7,0x8d,0xe8,0x8e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *This,
        TrustLevel *trustLevel);

    /*** IShownTileNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IShownTileNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_get_Arguments(This,value) (This)->lpVtbl->get_Arguments(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IShownTileNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_get_Arguments(__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Arguments(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IShownTileNotification IID___x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification
#define IShownTileNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotificationVtbl
#define IShownTileNotification __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification
#define IShownTileNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_QueryInterface
#define IShownTileNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_AddRef
#define IShownTileNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_Release
#define IShownTileNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetIids
#define IShownTileNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetRuntimeClassName
#define IShownTileNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_GetTrustLevel
#define IShownTileNotification_get_Arguments __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_get_Arguments
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ITileFlyoutNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification, 0x9a53b261, 0xc70c, 0x42be, 0xb2,0xf3, 0xf4,0x2a,0xa9,0x7d,0x34,0xe5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("9a53b261-c70c-42be-b2f3-f42aa97d34e5")
                ITileFlyoutNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification, 0x9a53b261, 0xc70c, 0x42be, 0xb2,0xf3, 0xf4,0x2a,0xa9,0x7d,0x34,0xe5)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        TrustLevel *trustLevel);

    /*** ITileFlyoutNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *This,
        __FIReference_1_DateTime **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileFlyoutNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileFlyoutNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileFlyoutNotification IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification
#define ITileFlyoutNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationVtbl
#define ITileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification
#define ITileFlyoutNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_QueryInterface
#define ITileFlyoutNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_AddRef
#define ITileFlyoutNotification_Release __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_Release
#define ITileFlyoutNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetIids
#define ITileFlyoutNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetRuntimeClassName
#define ITileFlyoutNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_GetTrustLevel
#define ITileFlyoutNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_Content
#define ITileFlyoutNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_put_ExpirationTime
#define ITileFlyoutNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_get_ExpirationTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITileFlyoutNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory, 0xef556ff5, 0x5226, 0x4f2b, 0xb2,0x78, 0x88,0xa3,0x5d,0xfe,0x56,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("ef556ff5-5226-4f2b-b278-88a35dfe569f")
                ITileFlyoutNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileFlyoutNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::UI::Notifications::ITileFlyoutNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory, 0xef556ff5, 0x5226, 0x4f2b, 0xb2,0x78, 0x88,0xa3,0x5d,0xfe,0x56,0x9f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory *This,
        TrustLevel *trustLevel);

    /*** ITileFlyoutNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileFlyoutNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileFlyoutNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_CreateTileFlyoutNotification(This,content,value) (This)->lpVtbl->CreateTileFlyoutNotification(This,content,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileFlyoutNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_CreateTileFlyoutNotification(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification **value) {
    return This->lpVtbl->CreateTileFlyoutNotification(This,content,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileFlyoutNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory
#define ITileFlyoutNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactoryVtbl
#define ITileFlyoutNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory
#define ITileFlyoutNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_QueryInterface
#define ITileFlyoutNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_AddRef
#define ITileFlyoutNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_Release
#define ITileFlyoutNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetIids
#define ITileFlyoutNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetRuntimeClassName
#define ITileFlyoutNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_GetTrustLevel
#define ITileFlyoutNotificationFactory_CreateTileFlyoutNotification __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_CreateTileFlyoutNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotificationFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITileFlyoutUpdateManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics, 0x04363b0b, 0x1ac0, 0x4b99, 0x88,0xe7, 0xad,0xa8,0x3e,0x95,0x3d,0x48);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("04363b0b-1ac0-4b99-88e7-ada83e953d48")
                ITileFlyoutUpdateManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileFlyoutUpdaterForApplication(
                        ABI::Windows::UI::Notifications::ITileFlyoutUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileFlyoutUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::ITileFlyoutUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileFlyoutUpdaterForSecondaryTile(
                        HSTRING tile_id,
                        ABI::Windows::UI::Notifications::ITileFlyoutUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTemplateContent(
                        ABI::Windows::UI::Notifications::TileFlyoutTemplateType type,
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics, 0x04363b0b, 0x1ac0, 0x4b99, 0x88,0xe7, 0xad,0xa8,0x3e,0x95,0x3d,0x48)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        TrustLevel *trustLevel);

    /*** ITileFlyoutUpdateManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileFlyoutUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileFlyoutUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileFlyoutUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        HSTRING tile_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result);

    HRESULT (STDMETHODCALLTYPE *GetTemplateContent)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType type,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileFlyoutUpdateManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplication(This,result) (This)->lpVtbl->CreateTileFlyoutUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateTileFlyoutUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForSecondaryTile(This,tile_id,result) (This)->lpVtbl->CreateTileFlyoutUpdaterForSecondaryTile(This,tile_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTemplateContent(This,type,result) (This)->lpVtbl->GetTemplateContent(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileFlyoutUpdateManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result) {
    return This->lpVtbl->CreateTileFlyoutUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result) {
    return This->lpVtbl->CreateTileFlyoutUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,HSTRING tile_id,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater **result) {
    return This->lpVtbl->CreateTileFlyoutUpdaterForSecondaryTile(This,tile_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTemplateContent(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CTileFlyoutTemplateType type,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result) {
    return This->lpVtbl->GetTemplateContent(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileFlyoutUpdateManagerStatics IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics
#define ITileFlyoutUpdateManagerStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStaticsVtbl
#define ITileFlyoutUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics
#define ITileFlyoutUpdateManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_QueryInterface
#define ITileFlyoutUpdateManagerStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_AddRef
#define ITileFlyoutUpdateManagerStatics_Release __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_Release
#define ITileFlyoutUpdateManagerStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetIids
#define ITileFlyoutUpdateManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetRuntimeClassName
#define ITileFlyoutUpdateManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTrustLevel
#define ITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplication
#define ITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForApplicationWithId
#define ITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_CreateTileFlyoutUpdaterForSecondaryTile
#define ITileFlyoutUpdateManagerStatics_GetTemplateContent __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_GetTemplateContent
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdateManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITileFlyoutUpdater interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater, 0x8d40c76a, 0xc465, 0x4052, 0xa7,0x40, 0x5c,0x26,0x54,0xc1,0xa0,0x89);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("8d40c76a-c465-4052-a740-5c2654c1a089")
                ITileFlyoutUpdater : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Update(
                        ABI::Windows::UI::Notifications::ITileFlyoutNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdate(
                        ABI::Windows::Foundation::IUriRuntimeClass *tile_flyout_content,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateAtTime(
                        ABI::Windows::Foundation::IUriRuntimeClass *tile_flyout_content,
                        ABI::Windows::Foundation::DateTime start_time,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopPeriodicUpdate(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Setting(
                        ABI::Windows::UI::Notifications::NotificationSetting *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater, 0x8d40c76a, 0xc465, 0x4052, 0xa7,0x40, 0x5c,0x26,0x54,0xc1,0xa0,0x89)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdaterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        TrustLevel *trustLevel);

    /*** ITileFlyoutUpdater methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *notification);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_flyout_content,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateAtTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_flyout_content,
        __x_ABI_CWindows_CFoundation_CDateTime start_time,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StopPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This);

    HRESULT (STDMETHODCALLTYPE *get_Setting)(
        __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdaterVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdaterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileFlyoutUpdater methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Update(This,notification) (This)->lpVtbl->Update(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdate(This,tile_flyout_content,requested_interval) (This)->lpVtbl->StartPeriodicUpdate(This,tile_flyout_content,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdateAtTime(This,tile_flyout_content,start_time,requested_interval) (This)->lpVtbl->StartPeriodicUpdateAtTime(This,tile_flyout_content,start_time,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StopPeriodicUpdate(This) (This)->lpVtbl->StopPeriodicUpdate(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_get_Setting(This,value) (This)->lpVtbl->get_Setting(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Release(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileFlyoutUpdater methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Update(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutNotification *notification) {
    return This->lpVtbl->Update(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Clear(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_flyout_content,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdate(This,tile_flyout_content,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdateAtTime(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_flyout_content,__x_ABI_CWindows_CFoundation_CDateTime start_time,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateAtTime(This,tile_flyout_content,start_time,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StopPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This) {
    return This->lpVtbl->StopPeriodicUpdate(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_get_Setting(__x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value) {
    return This->lpVtbl->get_Setting(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileFlyoutUpdater IID___x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater
#define ITileFlyoutUpdaterVtbl __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdaterVtbl
#define ITileFlyoutUpdater __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater
#define ITileFlyoutUpdater_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_QueryInterface
#define ITileFlyoutUpdater_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_AddRef
#define ITileFlyoutUpdater_Release __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Release
#define ITileFlyoutUpdater_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetIids
#define ITileFlyoutUpdater_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetRuntimeClassName
#define ITileFlyoutUpdater_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_GetTrustLevel
#define ITileFlyoutUpdater_Update __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Update
#define ITileFlyoutUpdater_Clear __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_Clear
#define ITileFlyoutUpdater_StartPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdate
#define ITileFlyoutUpdater_StartPeriodicUpdateAtTime __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StartPeriodicUpdateAtTime
#define ITileFlyoutUpdater_StopPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_StopPeriodicUpdate
#define ITileFlyoutUpdater_get_Setting __x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_get_Setting
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileFlyoutUpdater_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITileNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileNotification, 0xebaec8fa, 0x50ec, 0x4c18, 0xb4,0xd0, 0x3a,0xf0,0x2e,0x55,0x40,0xab);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("ebaec8fa-50ec-4c18-b4d0-3af02e5540ab")
                ITileNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileNotification, 0xebaec8fa, 0x50ec, 0x4c18, 0xb4,0xd0, 0x3a,0xf0,0x2e,0x55,0x40,0xab)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        TrustLevel *trustLevel);

    /*** ITileNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_Tag(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Tag(__x_ABI_CWindows_CUI_CNotifications_CITileNotification* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileNotification IID___x_ABI_CWindows_CUI_CNotifications_CITileNotification
#define ITileNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CITileNotificationVtbl
#define ITileNotification __x_ABI_CWindows_CUI_CNotifications_CITileNotification
#define ITileNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileNotification_QueryInterface
#define ITileNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileNotification_AddRef
#define ITileNotification_Release __x_ABI_CWindows_CUI_CNotifications_CITileNotification_Release
#define ITileNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetIids
#define ITileNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetRuntimeClassName
#define ITileNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileNotification_GetTrustLevel
#define ITileNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Content
#define ITileNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_ExpirationTime
#define ITileNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_ExpirationTime
#define ITileNotification_put_Tag __x_ABI_CWindows_CUI_CNotifications_CITileNotification_put_Tag
#define ITileNotification_get_Tag __x_ABI_CWindows_CUI_CNotifications_CITileNotification_get_Tag
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITileNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory, 0xc6abdd6e, 0x4928, 0x46c8, 0xbd,0xbf, 0x81,0xa0,0x47,0xde,0xa0,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("c6abdd6e-4928-46c8-bdbf-81a047dea0d4")
                ITileNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::UI::Notifications::ITileNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory, 0xc6abdd6e, 0x4928, 0x46c8, 0xbd,0xbf, 0x81,0xa0,0x47,0xde,0xa0,0xd4)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory *This,
        TrustLevel *trustLevel);

    /*** ITileNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_CreateTileNotification(This,content,value) (This)->lpVtbl->CreateTileNotification(This,content,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_CreateTileNotification(__x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CUI_CNotifications_CITileNotification **value) {
    return This->lpVtbl->CreateTileNotification(This,content,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory
#define ITileNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactoryVtbl
#define ITileNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory
#define ITileNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_QueryInterface
#define ITileNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_AddRef
#define ITileNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_Release
#define ITileNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetIids
#define ITileNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetRuntimeClassName
#define ITileNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_GetTrustLevel
#define ITileNotificationFactory_CreateTileNotification __x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_CreateTileNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileNotificationFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITileUpdateManagerForUser interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser, 0x55141348, 0x2ee2, 0x4e2d, 0x9c,0xc1, 0x21,0x6a,0x20,0xde,0xcc,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("55141348-2ee2-4e2d-9cc1-216a20decc9f")
                ITileUpdateManagerForUser : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForApplication(
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForSecondaryTile(
                        HSTRING tile_id,
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_User(
                        ABI::Windows::System::IUser **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser, 0x55141348, 0x2ee2, 0x4e2d, 0x9c,0xc1, 0x21,0x6a,0x20,0xde,0xcc,0x9f)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUserVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        TrustLevel *trustLevel);

    /*** ITileUpdateManagerForUser methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        HSTRING tile_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUserVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdateManagerForUser methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplication(This,result) (This)->lpVtbl->CreateTileUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateTileUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForSecondaryTile(This,tile_id,result) (This)->lpVtbl->CreateTileUpdaterForSecondaryTile(This,tile_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdateManagerForUser methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,HSTRING tile_id,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForSecondaryTile(This,tile_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_get_User(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdateManagerForUser IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser
#define ITileUpdateManagerForUserVtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUserVtbl
#define ITileUpdateManagerForUser __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser
#define ITileUpdateManagerForUser_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_QueryInterface
#define ITileUpdateManagerForUser_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_AddRef
#define ITileUpdateManagerForUser_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_Release
#define ITileUpdateManagerForUser_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetIids
#define ITileUpdateManagerForUser_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetRuntimeClassName
#define ITileUpdateManagerForUser_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_GetTrustLevel
#define ITileUpdateManagerForUser_CreateTileUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplication
#define ITileUpdateManagerForUser_CreateTileUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForApplicationWithId
#define ITileUpdateManagerForUser_CreateTileUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_CreateTileUpdaterForSecondaryTile
#define ITileUpdateManagerForUser_get_User __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_get_User
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ITileUpdateManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics, 0xda159e5d, 0x3ea9, 0x4986, 0x8d,0x84, 0xb0,0x9d,0x5e,0x12,0x27,0x6d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("da159e5d-3ea9-4986-8d84-b09d5e12276d")
                ITileUpdateManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForApplication(
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForApplicationWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateTileUpdaterForSecondaryTile(
                        HSTRING tileId,
                        ABI::Windows::UI::Notifications::ITileUpdater **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTemplateContent(
                        ABI::Windows::UI::Notifications::TileTemplateType type,
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics, 0xda159e5d, 0x3ea9, 0x4986, 0x8d,0x84, 0xb0,0x9d,0x5e,0x12,0x27,0x6d)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        TrustLevel *trustLevel);

    /*** ITileUpdateManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForApplication)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForApplicationWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *CreateTileUpdaterForSecondaryTile)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        HSTRING tileId,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result);

    HRESULT (STDMETHODCALLTYPE *GetTemplateContent)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CTileTemplateType type,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdateManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplication(This,result) (This)->lpVtbl->CreateTileUpdaterForApplication(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplicationWithId(This,application_id,result) (This)->lpVtbl->CreateTileUpdaterForApplicationWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForSecondaryTile(This,tileId,result) (This)->lpVtbl->CreateTileUpdaterForSecondaryTile(This,tileId,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTemplateContent(This,type,result) (This)->lpVtbl->GetTemplateContent(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdateManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplication(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForApplication(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplicationWithId(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForApplicationWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForSecondaryTile(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,HSTRING tileId,__x_ABI_CWindows_CUI_CNotifications_CITileUpdater **result) {
    return This->lpVtbl->CreateTileUpdaterForSecondaryTile(This,tileId,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTemplateContent(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CTileTemplateType type,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result) {
    return This->lpVtbl->GetTemplateContent(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdateManagerStatics IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics
#define ITileUpdateManagerStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStaticsVtbl
#define ITileUpdateManagerStatics __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics
#define ITileUpdateManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_QueryInterface
#define ITileUpdateManagerStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_AddRef
#define ITileUpdateManagerStatics_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_Release
#define ITileUpdateManagerStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetIids
#define ITileUpdateManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetRuntimeClassName
#define ITileUpdateManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTrustLevel
#define ITileUpdateManagerStatics_CreateTileUpdaterForApplication __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplication
#define ITileUpdateManagerStatics_CreateTileUpdaterForApplicationWithId __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForApplicationWithId
#define ITileUpdateManagerStatics_CreateTileUpdaterForSecondaryTile __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_CreateTileUpdaterForSecondaryTile
#define ITileUpdateManagerStatics_GetTemplateContent __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_GetTemplateContent
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITileUpdateManagerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2, 0x731c1ddc, 0x8e14, 0x4b7c, 0xa3,0x4b, 0x9d,0x22,0xde,0x76,0xc8,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("731c1ddc-8e14-4b7c-a34b-9d22de76c84d")
                ITileUpdateManagerStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForUser(
                        ABI::Windows::System::IUser *user,
                        ABI::Windows::UI::Notifications::ITileUpdateManagerForUser **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2, 0x731c1ddc, 0x8e14, 0x4b7c, 0xa3,0x4b, 0x9d,0x22,0xde,0x76,0xc8,0x4d)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 *This,
        TrustLevel *trustLevel);

    /*** ITileUpdateManagerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForUser)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 *This,
        __x_ABI_CWindows_CSystem_CIUser *user,
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdateManagerStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetForUser(This,user,result) (This)->lpVtbl->GetForUser(This,user,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdateManagerStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetForUser(__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2* This,__x_ABI_CWindows_CSystem_CIUser *user,__x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerForUser **result) {
    return This->lpVtbl->GetForUser(This,user,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdateManagerStatics2 IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2
#define ITileUpdateManagerStatics2Vtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2Vtbl
#define ITileUpdateManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2
#define ITileUpdateManagerStatics2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_QueryInterface
#define ITileUpdateManagerStatics2_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_AddRef
#define ITileUpdateManagerStatics2_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_Release
#define ITileUpdateManagerStatics2_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetIids
#define ITileUpdateManagerStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetRuntimeClassName
#define ITileUpdateManagerStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetTrustLevel
#define ITileUpdateManagerStatics2_GetForUser __x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_GetForUser
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileUpdateManagerStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * ITileUpdater interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdater, 0x0942a48b, 0x1d91, 0x44ec, 0x92,0x43, 0xc1,0xe8,0x21,0xc2,0x9a,0x20);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("0942a48b-1d91-44ec-9243-c1e821c29a20")
                ITileUpdater : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Update(
                        ABI::Windows::UI::Notifications::ITileNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE EnableNotificationQueue(
                        boolean enable) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Setting(
                        ABI::Windows::UI::Notifications::NotificationSetting *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE AddToSchedule(
                        ABI::Windows::UI::Notifications::IScheduledTileNotification *scheduled_tile) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveFromSchedule(
                        ABI::Windows::UI::Notifications::IScheduledTileNotification *scheduled_tile) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetScheduledTileNotifications(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdate(
                        ABI::Windows::Foundation::IUriRuntimeClass *tile_content,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateAtTime(
                        ABI::Windows::Foundation::IUriRuntimeClass *tile_content,
                        ABI::Windows::Foundation::DateTime start_time,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StopPeriodicUpdate(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateBatch(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *tile_contents,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                    virtual HRESULT STDMETHODCALLTYPE StartPeriodicUpdateBatchAtTime(
                        ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Foundation::Uri* > *tile_contents,
                        ABI::Windows::Foundation::DateTime start_time,
                        ABI::Windows::UI::Notifications::PeriodicUpdateRecurrence requested_interval) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater, 0x0942a48b, 0x1d91, 0x44ec, 0x92,0x43, 0xc1,0xe8,0x21,0xc2,0x9a,0x20)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdaterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        TrustLevel *trustLevel);

    /*** ITileUpdater methods ***/
    HRESULT (STDMETHODCALLTYPE *Update)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CITileNotification *notification);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This);

    HRESULT (STDMETHODCALLTYPE *EnableNotificationQueue)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        boolean enable);

    HRESULT (STDMETHODCALLTYPE *get_Setting)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value);

    HRESULT (STDMETHODCALLTYPE *AddToSchedule)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *scheduled_tile);

    HRESULT (STDMETHODCALLTYPE *RemoveFromSchedule)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *scheduled_tile);

    HRESULT (STDMETHODCALLTYPE *GetScheduledTileNotifications)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification **result);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_content,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateAtTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_content,
        __x_ABI_CWindows_CFoundation_CDateTime start_time,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StopPeriodicUpdate)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateBatch)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __FIIterable_1_Windows__CFoundation__CUri *tile_contents,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    HRESULT (STDMETHODCALLTYPE *StartPeriodicUpdateBatchAtTime)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater *This,
        __FIIterable_1_Windows__CFoundation__CUri *tile_contents,
        __x_ABI_CWindows_CFoundation_CDateTime start_time,
        __x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdaterVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdaterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdater methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Update(This,notification) (This)->lpVtbl->Update(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_EnableNotificationQueue(This,enable) (This)->lpVtbl->EnableNotificationQueue(This,enable)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_get_Setting(This,value) (This)->lpVtbl->get_Setting(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddToSchedule(This,scheduled_tile) (This)->lpVtbl->AddToSchedule(This,scheduled_tile)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_RemoveFromSchedule(This,scheduled_tile) (This)->lpVtbl->RemoveFromSchedule(This,scheduled_tile)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetScheduledTileNotifications(This,result) (This)->lpVtbl->GetScheduledTileNotifications(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdate(This,tile_content,requested_interval) (This)->lpVtbl->StartPeriodicUpdate(This,tile_content,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateAtTime(This,tile_content,start_time,requested_interval) (This)->lpVtbl->StartPeriodicUpdateAtTime(This,tile_content,start_time,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StopPeriodicUpdate(This) (This)->lpVtbl->StopPeriodicUpdate(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatch(This,tile_contents,requested_interval) (This)->lpVtbl->StartPeriodicUpdateBatch(This,tile_contents,requested_interval)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatchAtTime(This,tile_contents,start_time,requested_interval) (This)->lpVtbl->StartPeriodicUpdateBatchAtTime(This,tile_contents,start_time,requested_interval)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdater methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Update(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CITileNotification *notification) {
    return This->lpVtbl->Update(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Clear(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_EnableNotificationQueue(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,boolean enable) {
    return This->lpVtbl->EnableNotificationQueue(This,enable);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_get_Setting(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value) {
    return This->lpVtbl->get_Setting(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddToSchedule(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *scheduled_tile) {
    return This->lpVtbl->AddToSchedule(This,scheduled_tile);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_RemoveFromSchedule(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *scheduled_tile) {
    return This->lpVtbl->RemoveFromSchedule(This,scheduled_tile);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetScheduledTileNotifications(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification **result) {
    return This->lpVtbl->GetScheduledTileNotifications(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_content,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdate(This,tile_content,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateAtTime(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *tile_content,__x_ABI_CWindows_CFoundation_CDateTime start_time,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateAtTime(This,tile_content,start_time,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StopPeriodicUpdate(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This) {
    return This->lpVtbl->StopPeriodicUpdate(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatch(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__FIIterable_1_Windows__CFoundation__CUri *tile_contents,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateBatch(This,tile_contents,requested_interval);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatchAtTime(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater* This,__FIIterable_1_Windows__CFoundation__CUri *tile_contents,__x_ABI_CWindows_CFoundation_CDateTime start_time,__x_ABI_CWindows_CUI_CNotifications_CPeriodicUpdateRecurrence requested_interval) {
    return This->lpVtbl->StartPeriodicUpdateBatchAtTime(This,tile_contents,start_time,requested_interval);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdater IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdater
#define ITileUpdaterVtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdaterVtbl
#define ITileUpdater __x_ABI_CWindows_CUI_CNotifications_CITileUpdater
#define ITileUpdater_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_QueryInterface
#define ITileUpdater_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddRef
#define ITileUpdater_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Release
#define ITileUpdater_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetIids
#define ITileUpdater_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetRuntimeClassName
#define ITileUpdater_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetTrustLevel
#define ITileUpdater_Update __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Update
#define ITileUpdater_Clear __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_Clear
#define ITileUpdater_EnableNotificationQueue __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_EnableNotificationQueue
#define ITileUpdater_get_Setting __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_get_Setting
#define ITileUpdater_AddToSchedule __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_AddToSchedule
#define ITileUpdater_RemoveFromSchedule __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_RemoveFromSchedule
#define ITileUpdater_GetScheduledTileNotifications __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_GetScheduledTileNotifications
#define ITileUpdater_StartPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdate
#define ITileUpdater_StartPeriodicUpdateAtTime __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateAtTime
#define ITileUpdater_StopPeriodicUpdate __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StopPeriodicUpdate
#define ITileUpdater_StartPeriodicUpdateBatch __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatch
#define ITileUpdater_StartPeriodicUpdateBatchAtTime __x_ABI_CWindows_CUI_CNotifications_CITileUpdater_StartPeriodicUpdateBatchAtTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * ITileUpdater2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdater2, 0xa2266e12, 0x15ee, 0x43ed, 0x83,0xf5, 0x65,0xb3,0x52,0xbb,0x1a,0x84);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("a2266e12-15ee-43ed-83f5-65b352bb1a84")
                ITileUpdater2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE EnableNotificationQueueForSquare150x150(
                        boolean enable) = 0;

                    virtual HRESULT STDMETHODCALLTYPE EnableNotificationQueueForWide310x150(
                        boolean enable) = 0;

                    virtual HRESULT STDMETHODCALLTYPE EnableNotificationQueueForSquare310x310(
                        boolean enable) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2, 0xa2266e12, 0x15ee, 0x43ed, 0x83,0xf5, 0x65,0xb3,0x52,0xbb,0x1a,0x84)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        TrustLevel *trustLevel);

    /*** ITileUpdater2 methods ***/
    HRESULT (STDMETHODCALLTYPE *EnableNotificationQueueForSquare150x150)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        boolean enable);

    HRESULT (STDMETHODCALLTYPE *EnableNotificationQueueForWide310x150)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        boolean enable);

    HRESULT (STDMETHODCALLTYPE *EnableNotificationQueueForSquare310x310)(
        __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 *This,
        boolean enable);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** ITileUpdater2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare150x150(This,enable) (This)->lpVtbl->EnableNotificationQueueForSquare150x150(This,enable)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForWide310x150(This,enable) (This)->lpVtbl->EnableNotificationQueueForWide310x150(This,enable)
#define __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare310x310(This,enable) (This)->lpVtbl->EnableNotificationQueueForSquare310x310(This,enable)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_Release(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** ITileUpdater2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare150x150(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,boolean enable) {
    return This->lpVtbl->EnableNotificationQueueForSquare150x150(This,enable);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForWide310x150(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,boolean enable) {
    return This->lpVtbl->EnableNotificationQueueForWide310x150(This,enable);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare310x310(__x_ABI_CWindows_CUI_CNotifications_CITileUpdater2* This,boolean enable) {
    return This->lpVtbl->EnableNotificationQueueForSquare310x310(This,enable);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_ITileUpdater2 IID___x_ABI_CWindows_CUI_CNotifications_CITileUpdater2
#define ITileUpdater2Vtbl __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2Vtbl
#define ITileUpdater2 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2
#define ITileUpdater2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_QueryInterface
#define ITileUpdater2_AddRef __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_AddRef
#define ITileUpdater2_Release __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_Release
#define ITileUpdater2_GetIids __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetIids
#define ITileUpdater2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetRuntimeClassName
#define ITileUpdater2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_GetTrustLevel
#define ITileUpdater2_EnableNotificationQueueForSquare150x150 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare150x150
#define ITileUpdater2_EnableNotificationQueueForWide310x150 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForWide310x150
#define ITileUpdater2_EnableNotificationQueueForSquare310x310 __x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_EnableNotificationQueueForSquare310x310
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CITileUpdater2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastActivatedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs, 0xe3bf92f3, 0xc197, 0x436f, 0x82,0x65, 0x06,0x25,0x82,0x4f,0x8d,0xac);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("e3bf92f3-c197-436f-8265-0625824f8dac")
                IToastActivatedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Arguments(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs, 0xe3bf92f3, 0xc197, 0x436f, 0x82,0x65, 0x06,0x25,0x82,0x4f,0x8d,0xac)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IToastActivatedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Arguments)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastActivatedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_get_Arguments(This,value) (This)->lpVtbl->get_Arguments(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastActivatedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_get_Arguments(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs* This,HSTRING *value) {
    return This->lpVtbl->get_Arguments(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastActivatedEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs
#define IToastActivatedEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgsVtbl
#define IToastActivatedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs
#define IToastActivatedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_QueryInterface
#define IToastActivatedEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_AddRef
#define IToastActivatedEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_Release
#define IToastActivatedEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetIids
#define IToastActivatedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetRuntimeClassName
#define IToastActivatedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_GetTrustLevel
#define IToastActivatedEventArgs_get_Arguments __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_get_Arguments
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastActivatedEventArgs2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2, 0xab7da512, 0xcc61, 0x568e, 0x81,0xbe, 0x30,0x4a,0xc3,0x10,0x38,0xfa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("ab7da512-cc61-568e-81be-304ac31038fa")
                IToastActivatedEventArgs2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_UserInput(
                        ABI::Windows::Foundation::Collections::IPropertySet **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2, 0xab7da512, 0xcc61, 0x568e, 0x81,0xbe, 0x30,0x4a,0xc3,0x10,0x38,0xfa)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 *This,
        TrustLevel *trustLevel);

    /*** IToastActivatedEventArgs2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UserInput)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 *This,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastActivatedEventArgs2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_get_UserInput(This,value) (This)->lpVtbl->get_UserInput(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastActivatedEventArgs2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_get_UserInput(__x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2* This,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value) {
    return This->lpVtbl->get_UserInput(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastActivatedEventArgs2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2
#define IToastActivatedEventArgs2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2Vtbl
#define IToastActivatedEventArgs2 __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2
#define IToastActivatedEventArgs2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_QueryInterface
#define IToastActivatedEventArgs2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_AddRef
#define IToastActivatedEventArgs2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_Release
#define IToastActivatedEventArgs2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetIids
#define IToastActivatedEventArgs2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetRuntimeClassName
#define IToastActivatedEventArgs2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_GetTrustLevel
#define IToastActivatedEventArgs2_get_UserInput __x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_get_UserInput
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastActivatedEventArgs2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IToastCollection interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollection, 0x0a8bc3b0, 0xe0be, 0x4858, 0xbc,0x2a, 0x89,0xdf,0xe0,0xb3,0x28,0x63);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("0a8bc3b0-e0be-4858-bc2a-89dfe0b32863")
                IToastCollection : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_DisplayName(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_LaunchArgs(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_LaunchArgs(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Icon(
                        ABI::Windows::Foundation::IUriRuntimeClass **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Icon(
                        ABI::Windows::Foundation::IUriRuntimeClass *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection, 0x0a8bc3b0, 0xe0be, 0x4858, 0xbc,0x2a, 0x89,0xdf,0xe0,0xb3,0x28,0x63)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        TrustLevel *trustLevel);

    /*** IToastCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_DisplayName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_LaunchArgs)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_LaunchArgs)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Icon)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value);

    HRESULT (STDMETHODCALLTYPE *put_Icon)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollection {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastCollection methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_DisplayName(This,value) (This)->lpVtbl->get_DisplayName(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_DisplayName(This,value) (This)->lpVtbl->put_DisplayName(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_LaunchArgs(This,value) (This)->lpVtbl->get_LaunchArgs(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_LaunchArgs(This,value) (This)->lpVtbl->put_LaunchArgs(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Icon(This,value) (This)->lpVtbl->get_Icon(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_Icon(This,value) (This)->lpVtbl->put_Icon(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastCollection methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Id(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING *value) {
    return This->lpVtbl->get_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_DisplayName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING *value) {
    return This->lpVtbl->get_DisplayName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_DisplayName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING value) {
    return This->lpVtbl->put_DisplayName(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_LaunchArgs(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING *value) {
    return This->lpVtbl->get_LaunchArgs(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_LaunchArgs(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,HSTRING value) {
    return This->lpVtbl->put_LaunchArgs(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Icon(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass **value) {
    return This->lpVtbl->get_Icon(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_Icon(__x_ABI_CWindows_CUI_CNotifications_CIToastCollection* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *value) {
    return This->lpVtbl->put_Icon(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastCollection IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollection
#define IToastCollectionVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionVtbl
#define IToastCollection __x_ABI_CWindows_CUI_CNotifications_CIToastCollection
#define IToastCollection_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_QueryInterface
#define IToastCollection_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_AddRef
#define IToastCollection_Release __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_Release
#define IToastCollection_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetIids
#define IToastCollection_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetRuntimeClassName
#define IToastCollection_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_GetTrustLevel
#define IToastCollection_get_Id __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Id
#define IToastCollection_get_DisplayName __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_DisplayName
#define IToastCollection_put_DisplayName __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_DisplayName
#define IToastCollection_get_LaunchArgs __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_LaunchArgs
#define IToastCollection_put_LaunchArgs __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_LaunchArgs
#define IToastCollection_get_Icon __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_get_Icon
#define IToastCollection_put_Icon __x_ABI_CWindows_CUI_CNotifications_CIToastCollection_put_Icon
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastCollection_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastCollectionFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory, 0x164dd3d7, 0x73c4, 0x44f7, 0xb4,0xff, 0xfb,0x6d,0x4b,0xf1,0xf4,0xc6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("164dd3d7-73c4-44f7-b4ff-fb6d4bf1f4c6")
                IToastCollectionFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
                        HSTRING collection_id,
                        HSTRING display_name,
                        HSTRING launch_args,
                        ABI::Windows::Foundation::IUriRuntimeClass *icon_uri,
                        ABI::Windows::UI::Notifications::IToastCollection **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory, 0x164dd3d7, 0x73c4, 0x44f7, 0xb4,0xff, 0xfb,0x6d,0x4b,0xf1,0xf4,0xc6)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory *This,
        TrustLevel *trustLevel);

    /*** IToastCollectionFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory *This,
        HSTRING collection_id,
        HSTRING display_name,
        HSTRING launch_args,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *icon_uri,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastCollectionFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_CreateInstance(This,collection_id,display_name,launch_args,icon_uri,value) (This)->lpVtbl->CreateInstance(This,collection_id,display_name,launch_args,icon_uri,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastCollectionFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_CreateInstance(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory* This,HSTRING collection_id,HSTRING display_name,HSTRING launch_args,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *icon_uri,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value) {
    return This->lpVtbl->CreateInstance(This,collection_id,display_name,launch_args,icon_uri,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastCollectionFactory IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory
#define IToastCollectionFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactoryVtbl
#define IToastCollectionFactory __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory
#define IToastCollectionFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_QueryInterface
#define IToastCollectionFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_AddRef
#define IToastCollectionFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_Release
#define IToastCollectionFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetIids
#define IToastCollectionFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetRuntimeClassName
#define IToastCollectionFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_GetTrustLevel
#define IToastCollectionFactory_CreateInstance __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_CreateInstance
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastCollectionManager interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager, 0x2a1821fe, 0x179d, 0x49bc, 0xb7,0x9d, 0xa5,0x27,0x92,0x0d,0x36,0x65);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("2a1821fe-179d-49bc-b79d-a527920d3665")
                IToastCollectionManager : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE SaveToastCollectionAsync(
                        ABI::Windows::UI::Notifications::IToastCollection *collection,
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE FindAllToastCollectionsAsync(
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetToastCollectionAsync(
                        HSTRING collection_id,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveToastCollectionAsync(
                        HSTRING collection_id,
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveAllToastCollectionsAsync(
                        ABI::Windows::Foundation::IAsyncAction **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_User(
                        ABI::Windows::System::IUser **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AppId(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager, 0x2a1821fe, 0x179d, 0x49bc, 0xb7,0x9d, 0xa5,0x27,0x92,0x0d,0x36,0x65)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        TrustLevel *trustLevel);

    /*** IToastCollectionManager methods ***/
    HRESULT (STDMETHODCALLTYPE *SaveToastCollectionAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *collection,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *FindAllToastCollectionsAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **operation);

    HRESULT (STDMETHODCALLTYPE *GetToastCollectionAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        HSTRING collection_id,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection **operation);

    HRESULT (STDMETHODCALLTYPE *RemoveToastCollectionAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        HSTRING collection_id,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *RemoveAllToastCollectionsAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **operation);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    HRESULT (STDMETHODCALLTYPE *get_AppId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManagerVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastCollectionManager methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_SaveToastCollectionAsync(This,collection,operation) (This)->lpVtbl->SaveToastCollectionAsync(This,collection,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FindAllToastCollectionsAsync(This,operation) (This)->lpVtbl->FindAllToastCollectionsAsync(This,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetToastCollectionAsync(This,collection_id,operation) (This)->lpVtbl->GetToastCollectionAsync(This,collection_id,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveToastCollectionAsync(This,collection_id,operation) (This)->lpVtbl->RemoveToastCollectionAsync(This,collection_id,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveAllToastCollectionsAsync(This,operation) (This)->lpVtbl->RemoveAllToastCollectionsAsync(This,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_AppId(This,value) (This)->lpVtbl->get_AppId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastCollectionManager methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_SaveToastCollectionAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection *collection,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->SaveToastCollectionAsync(This,collection,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FindAllToastCollectionsAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **operation) {
    return This->lpVtbl->FindAllToastCollectionsAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetToastCollectionAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,HSTRING collection_id,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection **operation) {
    return This->lpVtbl->GetToastCollectionAsync(This,collection_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveToastCollectionAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,HSTRING collection_id,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->RemoveToastCollectionAsync(This,collection_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveAllToastCollectionsAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,__x_ABI_CWindows_CFoundation_CIAsyncAction **operation) {
    return This->lpVtbl->RemoveAllToastCollectionsAsync(This,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_User(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_AppId(__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager* This,HSTRING *value) {
    return This->lpVtbl->get_AppId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastCollectionManager IID___x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager
#define IToastCollectionManagerVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManagerVtbl
#define IToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager
#define IToastCollectionManager_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_QueryInterface
#define IToastCollectionManager_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_AddRef
#define IToastCollectionManager_Release __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_Release
#define IToastCollectionManager_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetIids
#define IToastCollectionManager_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetRuntimeClassName
#define IToastCollectionManager_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetTrustLevel
#define IToastCollectionManager_SaveToastCollectionAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_SaveToastCollectionAsync
#define IToastCollectionManager_FindAllToastCollectionsAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_FindAllToastCollectionsAsync
#define IToastCollectionManager_GetToastCollectionAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_GetToastCollectionAsync
#define IToastCollectionManager_RemoveToastCollectionAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveToastCollectionAsync
#define IToastCollectionManager_RemoveAllToastCollectionsAsync __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_RemoveAllToastCollectionsAsync
#define IToastCollectionManager_get_User __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_User
#define IToastCollectionManager_get_AppId __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_get_AppId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastDismissedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs, 0x3f89d935, 0xd9cb, 0x4538, 0xa0,0xf0, 0xff,0xe7,0x65,0x99,0x38,0xf8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("3f89d935-d9cb-4538-a0f0-ffe7659938f8")
                IToastDismissedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Reason(
                        ABI::Windows::UI::Notifications::ToastDismissalReason *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs, 0x3f89d935, 0xd9cb, 0x4538, 0xa0,0xf0, 0xff,0xe7,0x65,0x99,0x38,0xf8)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IToastDismissedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Reason)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastDismissedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_get_Reason(This,value) (This)->lpVtbl->get_Reason(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastDismissedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_get_Reason(__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CToastDismissalReason *value) {
    return This->lpVtbl->get_Reason(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastDismissedEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs
#define IToastDismissedEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgsVtbl
#define IToastDismissedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs
#define IToastDismissedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_QueryInterface
#define IToastDismissedEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_AddRef
#define IToastDismissedEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_Release
#define IToastDismissedEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetIids
#define IToastDismissedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetRuntimeClassName
#define IToastDismissedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_GetTrustLevel
#define IToastDismissedEventArgs_get_Reason __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_get_Reason
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastFailedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs, 0x35176862, 0xcfd4, 0x44f8, 0xad,0x64, 0xf5,0x00,0xfd,0x89,0x6c,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("35176862-cfd4-44f8-ad64-f500fd896c3b")
                IToastFailedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ErrorCode(
                        HRESULT *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs, 0x35176862, 0xcfd4, 0x44f8, 0xad,0x64, 0xf5,0x00,0xfd,0x89,0x6c,0x3b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IToastFailedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ErrorCode)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *This,
        HRESULT *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastFailedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_get_ErrorCode(This,value) (This)->lpVtbl->get_ErrorCode(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastFailedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_get_ErrorCode(__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs* This,HRESULT *value) {
    return This->lpVtbl->get_ErrorCode(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastFailedEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs
#define IToastFailedEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgsVtbl
#define IToastFailedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs
#define IToastFailedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_QueryInterface
#define IToastFailedEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_AddRef
#define IToastFailedEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_Release
#define IToastFailedEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetIids
#define IToastFailedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetRuntimeClassName
#define IToastFailedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_GetTrustLevel
#define IToastFailedEventArgs_get_ErrorCode __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_get_ErrorCode
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification, 0x997e2675, 0x059e, 0x4e60, 0x8b,0x06, 0x17,0x60,0x91,0x7c,0x8b,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("997e2675-059e-4e60-8b06-1760917c8b80")
                IToastNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Content(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_ExpirationTime(
                        ABI::Windows::Foundation::IReference<ABI::Windows::Foundation::DateTime > **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Dismissed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Dismissed(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Activated(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Activated(
                        EventRegistrationToken token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_Failed(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_Failed(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification, 0x997e2675, 0x059e, 0x4e60, 0x8b,0x06, 0x17,0x60,0x91,0x7c,0x8b,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        TrustLevel *trustLevel);

    /*** IToastNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Content)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *put_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FIReference_1_DateTime *value);

    HRESULT (STDMETHODCALLTYPE *get_ExpirationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FIReference_1_DateTime **value);

    HRESULT (STDMETHODCALLTYPE *add_Dismissed)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Dismissed)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_Activated)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Activated)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        EventRegistrationToken token);

    HRESULT (STDMETHODCALLTYPE *add_Failed)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_Failed)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_Content(This,value) (This)->lpVtbl->get_Content(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_put_ExpirationTime(This,value) (This)->lpVtbl->put_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_ExpirationTime(This,value) (This)->lpVtbl->get_ExpirationTime(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Dismissed(This,handler,token) (This)->lpVtbl->add_Dismissed(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Dismissed(This,token) (This)->lpVtbl->remove_Dismissed(This,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Activated(This,handler,token) (This)->lpVtbl->add_Activated(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Activated(This,token) (This)->lpVtbl->remove_Activated(This,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Failed(This,handler,token) (This)->lpVtbl->add_Failed(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Failed(This,token) (This)->lpVtbl->remove_Failed(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_Content(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_Content(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_put_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FIReference_1_DateTime *value) {
    return This->lpVtbl->put_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_ExpirationTime(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FIReference_1_DateTime **value) {
    return This->lpVtbl->get_ExpirationTime(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Dismissed(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Dismissed(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Dismissed(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Dismissed(This,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Activated(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Activated(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Activated(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Activated(This,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Failed(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_Failed(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Failed(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_Failed(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification
#define IToastNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationVtbl
#define IToastNotification __x_ABI_CWindows_CUI_CNotifications_CIToastNotification
#define IToastNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_QueryInterface
#define IToastNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_AddRef
#define IToastNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_Release
#define IToastNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetIids
#define IToastNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetRuntimeClassName
#define IToastNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_GetTrustLevel
#define IToastNotification_get_Content __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_Content
#define IToastNotification_put_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_put_ExpirationTime
#define IToastNotification_get_ExpirationTime __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_get_ExpirationTime
#define IToastNotification_add_Dismissed __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Dismissed
#define IToastNotification_remove_Dismissed __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Dismissed
#define IToastNotification_add_Activated __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Activated
#define IToastNotification_remove_Activated __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Activated
#define IToastNotification_add_Failed __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_add_Failed
#define IToastNotification_remove_Failed __x_ABI_CWindows_CUI_CNotifications_CIToastNotification_remove_Failed
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotification2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification2, 0x9dfb9fd1, 0x143a, 0x490e, 0x90,0xbf, 0xb9,0xfb,0xa7,0x13,0x2d,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("9dfb9fd1-143a-490e-90bf-b9fba7132de7")
                IToastNotification2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE put_Tag(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Tag(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Group(
                        HSTRING value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Group(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_SuppressPopup(
                        boolean value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_SuppressPopup(
                        boolean *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2, 0x9dfb9fd1, 0x143a, 0x490e, 0x90,0xbf, 0xb9,0xfb,0xa7,0x13,0x2d,0xe7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        TrustLevel *trustLevel);

    /*** IToastNotification2 methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Tag)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Group)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Group)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_SuppressPopup)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_SuppressPopup)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 *This,
        boolean *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Tag(This,value) (This)->lpVtbl->put_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Tag(This,value) (This)->lpVtbl->get_Tag(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Group(This,value) (This)->lpVtbl->put_Group(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Group(This,value) (This)->lpVtbl->get_Group(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_SuppressPopup(This,value) (This)->lpVtbl->put_SuppressPopup(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_SuppressPopup(This,value) (This)->lpVtbl->get_SuppressPopup(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Tag(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING value) {
    return This->lpVtbl->put_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Tag(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING *value) {
    return This->lpVtbl->get_Tag(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Group(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING value) {
    return This->lpVtbl->put_Group(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Group(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,HSTRING *value) {
    return This->lpVtbl->get_Group(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_SuppressPopup(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,boolean value) {
    return This->lpVtbl->put_SuppressPopup(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_SuppressPopup(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification2* This,boolean *value) {
    return This->lpVtbl->get_SuppressPopup(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification2
#define IToastNotification2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2Vtbl
#define IToastNotification2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2
#define IToastNotification2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_QueryInterface
#define IToastNotification2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_AddRef
#define IToastNotification2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_Release
#define IToastNotification2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetIids
#define IToastNotification2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetRuntimeClassName
#define IToastNotification2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_GetTrustLevel
#define IToastNotification2_put_Tag __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Tag
#define IToastNotification2_get_Tag __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Tag
#define IToastNotification2_put_Group __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_Group
#define IToastNotification2_get_Group __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_Group
#define IToastNotification2_put_SuppressPopup __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_put_SuppressPopup
#define IToastNotification2_get_SuppressPopup __x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_get_SuppressPopup
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotification3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification3, 0x31e8aed8, 0x8141, 0x4f99, 0xbc,0x0a, 0xc4,0xed,0x21,0x29,0x7d,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("31e8aed8-8141-4f99-bc0a-c4ed21297d77")
                IToastNotification3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_NotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_RemoteId(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_RemoteId(
                        HSTRING value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3, 0x31e8aed8, 0x8141, 0x4f99, 0xbc,0x0a, 0xc4,0xed,0x21,0x29,0x7d,0x77)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        TrustLevel *trustLevel);

    /*** IToastNotification3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring *value);

    HRESULT (STDMETHODCALLTYPE *put_NotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value);

    HRESULT (STDMETHODCALLTYPE *get_RemoteId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_RemoteId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification3 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_NotificationMirroring(This,value) (This)->lpVtbl->get_NotificationMirroring(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_NotificationMirroring(This,value) (This)->lpVtbl->put_NotificationMirroring(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_RemoteId(This,value) (This)->lpVtbl->get_RemoteId(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_RemoteId(This,value) (This)->lpVtbl->put_RemoteId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_NotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring *value) {
    return This->lpVtbl->get_NotificationMirroring(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_NotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value) {
    return This->lpVtbl->put_NotificationMirroring(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_RemoteId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,HSTRING *value) {
    return This->lpVtbl->get_RemoteId(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_RemoteId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification3* This,HSTRING value) {
    return This->lpVtbl->put_RemoteId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification3 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification3
#define IToastNotification3Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3Vtbl
#define IToastNotification3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3
#define IToastNotification3_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_QueryInterface
#define IToastNotification3_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_AddRef
#define IToastNotification3_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_Release
#define IToastNotification3_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetIids
#define IToastNotification3_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetRuntimeClassName
#define IToastNotification3_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_GetTrustLevel
#define IToastNotification3_get_NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_NotificationMirroring
#define IToastNotification3_put_NotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_NotificationMirroring
#define IToastNotification3_get_RemoteId __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_get_RemoteId
#define IToastNotification3_put_RemoteId __x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_put_RemoteId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IToastNotification4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification4, 0x15154935, 0x28ea, 0x4727, 0x88,0xe9, 0xc5,0x86,0x80,0xe2,0xd1,0x18);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("15154935-28ea-4727-88e9-c58680e2d118")
                IToastNotification4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Data(
                        ABI::Windows::UI::Notifications::INotificationData **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Data(
                        ABI::Windows::UI::Notifications::INotificationData *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Priority(
                        ABI::Windows::UI::Notifications::ToastNotificationPriority *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_Priority(
                        ABI::Windows::UI::Notifications::ToastNotificationPriority value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4, 0x15154935, 0x28ea, 0x4727, 0x88,0xe9, 0xc5,0x86,0x80,0xe2,0xd1,0x18)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        TrustLevel *trustLevel);

    /*** IToastNotification4 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData **value);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *value);

    HRESULT (STDMETHODCALLTYPE *get_Priority)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority *value);

    HRESULT (STDMETHODCALLTYPE *put_Priority)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification4 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Priority(This,value) (This)->lpVtbl->get_Priority(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Priority(This,value) (This)->lpVtbl->put_Priority(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Data(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationData **value) {
    return This->lpVtbl->get_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Data(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationData *value) {
    return This->lpVtbl->put_Data(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Priority(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,__x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority *value) {
    return This->lpVtbl->get_Priority(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Priority(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification4* This,__x_ABI_CWindows_CUI_CNotifications_CToastNotificationPriority value) {
    return This->lpVtbl->put_Priority(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification4 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification4
#define IToastNotification4Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4Vtbl
#define IToastNotification4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4
#define IToastNotification4_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_QueryInterface
#define IToastNotification4_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_AddRef
#define IToastNotification4_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_Release
#define IToastNotification4_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetIids
#define IToastNotification4_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetRuntimeClassName
#define IToastNotification4_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_GetTrustLevel
#define IToastNotification4_get_Data __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Data
#define IToastNotification4_put_Data __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Data
#define IToastNotification4_get_Priority __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_get_Priority
#define IToastNotification4_put_Priority __x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_put_Priority
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotification6 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification6, 0x43ebfe53, 0x89ae, 0x5c1e, 0xa2,0x79, 0x3a,0xec,0xfe,0x9b,0x6f,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("43ebfe53-89ae-5c1e-a279-3aecfe9b6f54")
                IToastNotification6 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ExpiresOnReboot(
                        boolean *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_ExpiresOnReboot(
                        boolean value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6, 0x43ebfe53, 0x89ae, 0x5c1e, 0xa2,0x79, 0x3a,0xec,0xfe,0x9b,0x6f,0x54)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This,
        TrustLevel *trustLevel);

    /*** IToastNotification6 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ExpiresOnReboot)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ExpiresOnReboot)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 *This,
        boolean value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotification6 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_get_ExpiresOnReboot(This,value) (This)->lpVtbl->get_ExpiresOnReboot(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_put_ExpiresOnReboot(This,value) (This)->lpVtbl->put_ExpiresOnReboot(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotification6 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_get_ExpiresOnReboot(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,boolean *value) {
    return This->lpVtbl->get_ExpiresOnReboot(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_put_ExpiresOnReboot(__x_ABI_CWindows_CUI_CNotifications_CIToastNotification6* This,boolean value) {
    return This->lpVtbl->put_ExpiresOnReboot(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotification6 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotification6
#define IToastNotification6Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6Vtbl
#define IToastNotification6 __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6
#define IToastNotification6_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_QueryInterface
#define IToastNotification6_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_AddRef
#define IToastNotification6_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_Release
#define IToastNotification6_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetIids
#define IToastNotification6_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetRuntimeClassName
#define IToastNotification6_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_GetTrustLevel
#define IToastNotification6_get_ExpiresOnReboot __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_get_ExpiresOnReboot
#define IToastNotification6_put_ExpiresOnReboot __x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_put_ExpiresOnReboot
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotification6_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x80000 */

/*****************************************************************************
 * IToastNotificationActionTriggerDetail interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail, 0x9445135a, 0x38f3, 0x42f6, 0x96,0xaa, 0x79,0x55,0xb0,0xf0,0x3d,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("9445135a-38f3-42f6-96aa-7955b0f03da2")
                IToastNotificationActionTriggerDetail : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Argument(
                        HSTRING *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_UserInput(
                        ABI::Windows::Foundation::Collections::IPropertySet **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail, 0x9445135a, 0x38f3, 0x42f6, 0x96,0xaa, 0x79,0x55,0xb0,0xf0,0x3d,0xa2)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetailVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationActionTriggerDetail methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Argument)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_UserInput)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail *This,
        __x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetailVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetailVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationActionTriggerDetail methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_Argument(This,value) (This)->lpVtbl->get_Argument(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_UserInput(This,value) (This)->lpVtbl->get_UserInput(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationActionTriggerDetail methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_Argument(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,HSTRING *value) {
    return This->lpVtbl->get_Argument(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_UserInput(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail* This,__x_ABI_CWindows_CFoundation_CCollections_CIPropertySet **value) {
    return This->lpVtbl->get_UserInput(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationActionTriggerDetail IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail
#define IToastNotificationActionTriggerDetailVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetailVtbl
#define IToastNotificationActionTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail
#define IToastNotificationActionTriggerDetail_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_QueryInterface
#define IToastNotificationActionTriggerDetail_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_AddRef
#define IToastNotificationActionTriggerDetail_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_Release
#define IToastNotificationActionTriggerDetail_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetIids
#define IToastNotificationActionTriggerDetail_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetRuntimeClassName
#define IToastNotificationActionTriggerDetail_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_GetTrustLevel
#define IToastNotificationActionTriggerDetail_get_Argument __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_Argument
#define IToastNotificationActionTriggerDetail_get_UserInput __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_get_UserInput
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationActionTriggerDetail_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotificationFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory, 0x04124b20, 0x82c6, 0x4229, 0xb1,0x09, 0xfd,0x9e,0xd4,0x66,0x2b,0x53);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("04124b20-82c6-4229-b109-fd9ed4662b53")
                IToastNotificationFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotification(
                        ABI::Windows::Data::Xml::Dom::IXmlDocument *content,
                        ABI::Windows::UI::Notifications::IToastNotification **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory, 0x04124b20, 0x82c6, 0x4229, 0xb1,0x09, 0xfd,0x9e,0xd4,0x66,0x2b,0x53)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateToastNotification)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationFactory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_CreateToastNotification(This,content,value) (This)->lpVtbl->CreateToastNotification(This,content,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_CreateToastNotification(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *content,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value) {
    return This->lpVtbl->CreateToastNotification(This,content,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationFactory IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory
#define IToastNotificationFactoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactoryVtbl
#define IToastNotificationFactory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory
#define IToastNotificationFactory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_QueryInterface
#define IToastNotificationFactory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_AddRef
#define IToastNotificationFactory_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_Release
#define IToastNotificationFactory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetIids
#define IToastNotificationFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetRuntimeClassName
#define IToastNotificationFactory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_GetTrustLevel
#define IToastNotificationFactory_CreateToastNotification __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_CreateToastNotification
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotificationHistory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory, 0x5caddc63, 0x01d3, 0x4c97, 0x98,0x6f, 0x05,0x33,0x48,0x3f,0xee,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("5caddc63-01d3-4c97-986f-0533483fee14")
                IToastNotificationHistory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE RemoveGroup(
                        HSTRING group) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveGroupWithId(
                        HSTRING group,
                        HSTRING application_id) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveGroupedTagWithId(
                        HSTRING tag,
                        HSTRING group,
                        HSTRING application_id) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveGroupedTag(
                        HSTRING tag,
                        HSTRING group) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Remove(
                        HSTRING tag) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Clear(
                        ) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ClearWithId(
                        HSTRING application_id) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory, 0x5caddc63, 0x01d3, 0x4c97, 0x98,0x6f, 0x05,0x33,0x48,0x3f,0xee,0x14)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationHistory methods ***/
    HRESULT (STDMETHODCALLTYPE *RemoveGroup)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING group);

    HRESULT (STDMETHODCALLTYPE *RemoveGroupWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING group,
        HSTRING application_id);

    HRESULT (STDMETHODCALLTYPE *RemoveGroupedTagWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING tag,
        HSTRING group,
        HSTRING application_id);

    HRESULT (STDMETHODCALLTYPE *RemoveGroupedTag)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING tag,
        HSTRING group);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING tag);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This);

    HRESULT (STDMETHODCALLTYPE *ClearWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory *This,
        HSTRING application_id);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationHistory methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroup(This,group) (This)->lpVtbl->RemoveGroup(This,group)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupWithId(This,group,application_id) (This)->lpVtbl->RemoveGroupWithId(This,group,application_id)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTagWithId(This,tag,group,application_id) (This)->lpVtbl->RemoveGroupedTagWithId(This,tag,group,application_id)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTag(This,tag,group) (This)->lpVtbl->RemoveGroupedTag(This,tag,group)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Remove(This,tag) (This)->lpVtbl->Remove(This,tag)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Clear(This) (This)->lpVtbl->Clear(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_ClearWithId(This,application_id) (This)->lpVtbl->ClearWithId(This,application_id)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationHistory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroup(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING group) {
    return This->lpVtbl->RemoveGroup(This,group);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING group,HSTRING application_id) {
    return This->lpVtbl->RemoveGroupWithId(This,group,application_id);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTagWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING tag,HSTRING group,HSTRING application_id) {
    return This->lpVtbl->RemoveGroupedTagWithId(This,tag,group,application_id);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTag(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING tag,HSTRING group) {
    return This->lpVtbl->RemoveGroupedTag(This,tag,group);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Remove(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING tag) {
    return This->lpVtbl->Remove(This,tag);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Clear(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_ClearWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory* This,HSTRING application_id) {
    return This->lpVtbl->ClearWithId(This,application_id);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationHistory IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory
#define IToastNotificationHistoryVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryVtbl
#define IToastNotificationHistory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory
#define IToastNotificationHistory_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_QueryInterface
#define IToastNotificationHistory_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_AddRef
#define IToastNotificationHistory_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Release
#define IToastNotificationHistory_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetIids
#define IToastNotificationHistory_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetRuntimeClassName
#define IToastNotificationHistory_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_GetTrustLevel
#define IToastNotificationHistory_RemoveGroup __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroup
#define IToastNotificationHistory_RemoveGroupWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupWithId
#define IToastNotificationHistory_RemoveGroupedTagWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTagWithId
#define IToastNotificationHistory_RemoveGroupedTag __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_RemoveGroupedTag
#define IToastNotificationHistory_Remove __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Remove
#define IToastNotificationHistory_Clear __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_Clear
#define IToastNotificationHistory_ClearWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_ClearWithId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotificationHistory2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2, 0x3bc3d253, 0x2f31, 0x4092, 0x91,0x29, 0x8a,0xd5,0xab,0xf0,0x67,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("3bc3d253-2f31-4092-9129-8ad5abf067da")
                IToastNotificationHistory2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetHistory(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetHistoryWithId(
                        HSTRING application_id,
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2, 0x3bc3d253, 0x2f31, 0x4092, 0x91,0x29, 0x8a,0xd5,0xab,0xf0,0x67,0xda)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationHistory2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetHistory)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification **result);

    HRESULT (STDMETHODCALLTYPE *GetHistoryWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 *This,
        HSTRING application_id,
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationHistory2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistory(This,result) (This)->lpVtbl->GetHistory(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistoryWithId(This,application_id,result) (This)->lpVtbl->GetHistoryWithId(This,application_id,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationHistory2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistory(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification **result) {
    return This->lpVtbl->GetHistory(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistoryWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2* This,HSTRING application_id,__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification **result) {
    return This->lpVtbl->GetHistoryWithId(This,application_id,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationHistory2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2
#define IToastNotificationHistory2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2Vtbl
#define IToastNotificationHistory2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2
#define IToastNotificationHistory2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_QueryInterface
#define IToastNotificationHistory2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_AddRef
#define IToastNotificationHistory2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_Release
#define IToastNotificationHistory2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetIids
#define IToastNotificationHistory2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetRuntimeClassName
#define IToastNotificationHistory2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetTrustLevel
#define IToastNotificationHistory2_GetHistory __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistory
#define IToastNotificationHistory2_GetHistoryWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_GetHistoryWithId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotificationHistoryChangedTriggerDetail interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail, 0xdb037ffa, 0x0068, 0x412c, 0x9c,0x83, 0x26,0x7c,0x37,0xf6,0x56,0x70);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("db037ffa-0068-412c-9c83-267c37f65670")
                IToastNotificationHistoryChangedTriggerDetail : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ChangeType(
                        ABI::Windows::UI::Notifications::ToastHistoryChangedType *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail, 0xdb037ffa, 0x0068, 0x412c, 0x9c,0x83, 0x26,0x7c,0x37,0xf6,0x56,0x70)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetailVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationHistoryChangedTriggerDetail methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ChangeType)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetailVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetailVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationHistoryChangedTriggerDetail methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_get_ChangeType(This,value) (This)->lpVtbl->get_ChangeType(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationHistoryChangedTriggerDetail methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_get_ChangeType(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail* This,__x_ABI_CWindows_CUI_CNotifications_CToastHistoryChangedType *value) {
    return This->lpVtbl->get_ChangeType(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationHistoryChangedTriggerDetail IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail
#define IToastNotificationHistoryChangedTriggerDetailVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetailVtbl
#define IToastNotificationHistoryChangedTriggerDetail __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail
#define IToastNotificationHistoryChangedTriggerDetail_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_QueryInterface
#define IToastNotificationHistoryChangedTriggerDetail_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_AddRef
#define IToastNotificationHistoryChangedTriggerDetail_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_Release
#define IToastNotificationHistoryChangedTriggerDetail_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetIids
#define IToastNotificationHistoryChangedTriggerDetail_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetRuntimeClassName
#define IToastNotificationHistoryChangedTriggerDetail_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_GetTrustLevel
#define IToastNotificationHistoryChangedTriggerDetail_get_ChangeType __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_get_ChangeType
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotificationHistoryChangedTriggerDetail2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2, 0x0b36e982, 0xc871, 0x49fb, 0xba,0xbb, 0x25,0xbd,0xbc,0x4c,0xc4,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("0b36e982-c871-49fb-babb-25bdbc4cc45b")
                IToastNotificationHistoryChangedTriggerDetail2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_CollectionId(
                        HSTRING *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2, 0x0b36e982, 0xc871, 0x49fb, 0xba,0xbb, 0x25,0xbd,0xbc,0x4c,0xc4,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationHistoryChangedTriggerDetail2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CollectionId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 *This,
        HSTRING *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationHistoryChangedTriggerDetail2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_get_CollectionId(This,value) (This)->lpVtbl->get_CollectionId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationHistoryChangedTriggerDetail2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_get_CollectionId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2* This,HSTRING *value) {
    return This->lpVtbl->get_CollectionId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationHistoryChangedTriggerDetail2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2
#define IToastNotificationHistoryChangedTriggerDetail2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2Vtbl
#define IToastNotificationHistoryChangedTriggerDetail2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2
#define IToastNotificationHistoryChangedTriggerDetail2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_QueryInterface
#define IToastNotificationHistoryChangedTriggerDetail2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_AddRef
#define IToastNotificationHistoryChangedTriggerDetail2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_Release
#define IToastNotificationHistoryChangedTriggerDetail2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetIids
#define IToastNotificationHistoryChangedTriggerDetail2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetRuntimeClassName
#define IToastNotificationHistoryChangedTriggerDetail2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_GetTrustLevel
#define IToastNotificationHistoryChangedTriggerDetail2_get_CollectionId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_get_CollectionId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistoryChangedTriggerDetail2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotificationManagerForUser interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser, 0x79ab57f6, 0x43fe, 0x487b, 0x8a,0x7f, 0x99,0x56,0x72,0x00,0xae,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("79ab57f6-43fe-487b-8a7f-99567200ae94")
                IToastNotificationManagerForUser : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotifier(
                        ABI::Windows::UI::Notifications::IToastNotifier **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotifierWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::IToastNotifier **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_History(
                        ABI::Windows::UI::Notifications::IToastNotificationHistory **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_User(
                        ABI::Windows::System::IUser **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser, 0x79ab57f6, 0x43fe, 0x487b, 0x8a,0x7f, 0x99,0x56,0x72,0x00,0xae,0x94)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUserVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationManagerForUser methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateToastNotifier)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result);

    HRESULT (STDMETHODCALLTYPE *CreateToastNotifierWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result);

    HRESULT (STDMETHODCALLTYPE *get_History)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **value);

    HRESULT (STDMETHODCALLTYPE *get_User)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *This,
        __x_ABI_CWindows_CSystem_CIUser **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUserVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUserVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerForUser methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifier(This,result) (This)->lpVtbl->CreateToastNotifier(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifierWithId(This,application_id,result) (This)->lpVtbl->CreateToastNotifierWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_History(This,value) (This)->lpVtbl->get_History(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_User(This,value) (This)->lpVtbl->get_User(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerForUser methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifier(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result) {
    return This->lpVtbl->CreateToastNotifier(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifierWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result) {
    return This->lpVtbl->CreateToastNotifierWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_History(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **value) {
    return This->lpVtbl->get_History(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_User(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser* This,__x_ABI_CWindows_CSystem_CIUser **value) {
    return This->lpVtbl->get_User(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerForUser IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser
#define IToastNotificationManagerForUserVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUserVtbl
#define IToastNotificationManagerForUser __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser
#define IToastNotificationManagerForUser_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_QueryInterface
#define IToastNotificationManagerForUser_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_AddRef
#define IToastNotificationManagerForUser_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_Release
#define IToastNotificationManagerForUser_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetIids
#define IToastNotificationManagerForUser_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetRuntimeClassName
#define IToastNotificationManagerForUser_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_GetTrustLevel
#define IToastNotificationManagerForUser_CreateToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifier
#define IToastNotificationManagerForUser_CreateToastNotifierWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_CreateToastNotifierWithId
#define IToastNotificationManagerForUser_get_History __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_History
#define IToastNotificationManagerForUser_get_User __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_get_User
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IToastNotificationManagerForUser2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2, 0x679c64b7, 0x81ab, 0x42c2, 0x88,0x19, 0xc9,0x58,0x76,0x77,0x53,0xf4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("679c64b7-81ab-42c2-8819-c958767753f4")
                IToastNotificationManagerForUser2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetToastNotifierForToastCollectionIdAsync(
                        HSTRING collection_id,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetHistoryForToastCollectionIdAsync(
                        HSTRING collection_id,
                        ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > **operation) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetToastCollectionManager(
                        ABI::Windows::UI::Notifications::IToastCollectionManager **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetToastCollectionManagerWithAppId(
                        HSTRING app_id,
                        ABI::Windows::UI::Notifications::IToastCollectionManager **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2, 0x679c64b7, 0x81ab, 0x42c2, 0x88,0x19, 0xc9,0x58,0x76,0x77,0x53,0xf4)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationManagerForUser2 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetToastNotifierForToastCollectionIdAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        HSTRING collection_id,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier **operation);

    HRESULT (STDMETHODCALLTYPE *GetHistoryForToastCollectionIdAsync)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        HSTRING collection_id,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory **operation);

    HRESULT (STDMETHODCALLTYPE *GetToastCollectionManager)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager **result);

    HRESULT (STDMETHODCALLTYPE *GetToastCollectionManagerWithAppId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 *This,
        HSTRING app_id,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerForUser2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastNotifierForToastCollectionIdAsync(This,collection_id,operation) (This)->lpVtbl->GetToastNotifierForToastCollectionIdAsync(This,collection_id,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetHistoryForToastCollectionIdAsync(This,collection_id,operation) (This)->lpVtbl->GetHistoryForToastCollectionIdAsync(This,collection_id,operation)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManager(This,result) (This)->lpVtbl->GetToastCollectionManager(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManagerWithAppId(This,app_id,result) (This)->lpVtbl->GetToastCollectionManagerWithAppId(This,app_id,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerForUser2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastNotifierForToastCollectionIdAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,HSTRING collection_id,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier **operation) {
    return This->lpVtbl->GetToastNotifierForToastCollectionIdAsync(This,collection_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetHistoryForToastCollectionIdAsync(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,HSTRING collection_id,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory **operation) {
    return This->lpVtbl->GetHistoryForToastCollectionIdAsync(This,collection_id,operation);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManager(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager **result) {
    return This->lpVtbl->GetToastCollectionManager(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManagerWithAppId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2* This,HSTRING app_id,__x_ABI_CWindows_CUI_CNotifications_CIToastCollectionManager **result) {
    return This->lpVtbl->GetToastCollectionManagerWithAppId(This,app_id,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerForUser2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2
#define IToastNotificationManagerForUser2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2Vtbl
#define IToastNotificationManagerForUser2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2
#define IToastNotificationManagerForUser2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_QueryInterface
#define IToastNotificationManagerForUser2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_AddRef
#define IToastNotificationManagerForUser2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_Release
#define IToastNotificationManagerForUser2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetIids
#define IToastNotificationManagerForUser2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetRuntimeClassName
#define IToastNotificationManagerForUser2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetTrustLevel
#define IToastNotificationManagerForUser2_GetToastNotifierForToastCollectionIdAsync __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastNotifierForToastCollectionIdAsync
#define IToastNotificationManagerForUser2_GetHistoryForToastCollectionIdAsync __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetHistoryForToastCollectionIdAsync
#define IToastNotificationManagerForUser2_GetToastCollectionManager __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManager
#define IToastNotificationManagerForUser2_GetToastCollectionManagerWithAppId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_GetToastCollectionManagerWithAppId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotificationManagerForUser3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3, 0x3efcb176, 0x6cc1, 0x56dc, 0x97,0x3b, 0x25,0x1f,0x7a,0xac,0xb1,0xc5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("3efcb176-6cc1-56dc-973b-251f7aacb1c5")
                IToastNotificationManagerForUser3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_NotificationMode(
                        ABI::Windows::UI::Notifications::ToastNotificationMode *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE add_NotificationModeChanged(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_NotificationModeChanged(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3, 0x3efcb176, 0x6cc1, 0x56dc, 0x97,0x3b, 0x25,0x1f,0x7a,0xac,0xb1,0xc5)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationManagerForUser3 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NotificationMode)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode *value);

    HRESULT (STDMETHODCALLTYPE *add_NotificationModeChanged)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_NotificationModeChanged)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerForUser3 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_get_NotificationMode(This,value) (This)->lpVtbl->get_NotificationMode(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_add_NotificationModeChanged(This,handler,token) (This)->lpVtbl->add_NotificationModeChanged(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_remove_NotificationModeChanged(This,token) (This)->lpVtbl->remove_NotificationModeChanged(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerForUser3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_get_NotificationMode(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,__x_ABI_CWindows_CUI_CNotifications_CToastNotificationMode *value) {
    return This->lpVtbl->get_NotificationMode(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_add_NotificationModeChanged(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_NotificationModeChanged(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_remove_NotificationModeChanged(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_NotificationModeChanged(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerForUser3 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3
#define IToastNotificationManagerForUser3Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3Vtbl
#define IToastNotificationManagerForUser3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3
#define IToastNotificationManagerForUser3_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_QueryInterface
#define IToastNotificationManagerForUser3_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_AddRef
#define IToastNotificationManagerForUser3_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_Release
#define IToastNotificationManagerForUser3_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetIids
#define IToastNotificationManagerForUser3_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetRuntimeClassName
#define IToastNotificationManagerForUser3_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_GetTrustLevel
#define IToastNotificationManagerForUser3_get_NotificationMode __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_get_NotificationMode
#define IToastNotificationManagerForUser3_add_NotificationModeChanged __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_add_NotificationModeChanged
#define IToastNotificationManagerForUser3_remove_NotificationModeChanged __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_remove_NotificationModeChanged
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0xf0000 */

/*****************************************************************************
 * IToastNotificationManagerStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics, 0x50ac103f, 0xd235, 0x4598, 0xbb,0xef, 0x98,0xfe,0x4d,0x1a,0x3a,0xd4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("50ac103f-d235-4598-bbef-98fe4d1a3ad4")
                IToastNotificationManagerStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotifier(
                        ABI::Windows::UI::Notifications::IToastNotifier **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateToastNotifierWithId(
                        HSTRING application_id,
                        ABI::Windows::UI::Notifications::IToastNotifier **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetTemplateContent(
                        ABI::Windows::UI::Notifications::ToastTemplateType type,
                        ABI::Windows::Data::Xml::Dom::IXmlDocument **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics, 0x50ac103f, 0xd235, 0x4598, 0xbb,0xef, 0x98,0xfe,0x4d,0x1a,0x3a,0xd4)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationManagerStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateToastNotifier)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result);

    HRESULT (STDMETHODCALLTYPE *CreateToastNotifierWithId)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        HSTRING application_id,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result);

    HRESULT (STDMETHODCALLTYPE *GetTemplateContent)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics *This,
        __x_ABI_CWindows_CUI_CNotifications_CToastTemplateType type,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStaticsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerStatics methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifier(This,result) (This)->lpVtbl->CreateToastNotifier(This,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifierWithId(This,application_id,result) (This)->lpVtbl->CreateToastNotifierWithId(This,application_id,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTemplateContent(This,type,result) (This)->lpVtbl->GetTemplateContent(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifier(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result) {
    return This->lpVtbl->CreateToastNotifier(This,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifierWithId(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,HSTRING application_id,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **result) {
    return This->lpVtbl->CreateToastNotifierWithId(This,application_id,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTemplateContent(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics* This,__x_ABI_CWindows_CUI_CNotifications_CToastTemplateType type,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **result) {
    return This->lpVtbl->GetTemplateContent(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerStatics IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics
#define IToastNotificationManagerStaticsVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStaticsVtbl
#define IToastNotificationManagerStatics __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics
#define IToastNotificationManagerStatics_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_QueryInterface
#define IToastNotificationManagerStatics_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_AddRef
#define IToastNotificationManagerStatics_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_Release
#define IToastNotificationManagerStatics_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetIids
#define IToastNotificationManagerStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetRuntimeClassName
#define IToastNotificationManagerStatics_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTrustLevel
#define IToastNotificationManagerStatics_CreateToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifier
#define IToastNotificationManagerStatics_CreateToastNotifierWithId __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_CreateToastNotifierWithId
#define IToastNotificationManagerStatics_GetTemplateContent __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_GetTemplateContent
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotificationManagerStatics2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2, 0x7ab93c52, 0x0e48, 0x4750, 0xba,0x9d, 0x1a,0x41,0x13,0x98,0x18,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("7ab93c52-0e48-4750-ba9d-1a4113981847")
                IToastNotificationManagerStatics2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_History(
                        ABI::Windows::UI::Notifications::IToastNotificationHistory **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2, 0x7ab93c52, 0x0e48, 0x4750, 0xba,0x9d, 0x1a,0x41,0x13,0x98,0x18,0x47)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationManagerStatics2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_History)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerStatics2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_get_History(This,value) (This)->lpVtbl->get_History(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerStatics2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_get_History(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **value) {
    return This->lpVtbl->get_History(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerStatics2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2
#define IToastNotificationManagerStatics2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2Vtbl
#define IToastNotificationManagerStatics2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2
#define IToastNotificationManagerStatics2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_QueryInterface
#define IToastNotificationManagerStatics2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_AddRef
#define IToastNotificationManagerStatics2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_Release
#define IToastNotificationManagerStatics2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetIids
#define IToastNotificationManagerStatics2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetRuntimeClassName
#define IToastNotificationManagerStatics2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_GetTrustLevel
#define IToastNotificationManagerStatics2_get_History __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_get_History
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotificationManagerStatics4 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4, 0x8f993fd3, 0xe516, 0x45fb, 0x81,0x30, 0x39,0x8e,0x93,0xfa,0x52,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("8f993fd3-e516-45fb-8130-398e93fa52c3")
                IToastNotificationManagerStatics4 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetForUser(
                        ABI::Windows::System::IUser *user,
                        ABI::Windows::UI::Notifications::IToastNotificationManagerForUser **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ConfigureNotificationMirroring(
                        ABI::Windows::UI::Notifications::NotificationMirroring value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4, 0x8f993fd3, 0xe516, 0x45fb, 0x81,0x30, 0x39,0x8e,0x93,0xfa,0x52,0xc3)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationManagerStatics4 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetForUser)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This,
        __x_ABI_CWindows_CSystem_CIUser *user,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser **result);

    HRESULT (STDMETHODCALLTYPE *ConfigureNotificationMirroring)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerStatics4 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetForUser(This,user,result) (This)->lpVtbl->GetForUser(This,user,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_ConfigureNotificationMirroring(This,value) (This)->lpVtbl->ConfigureNotificationMirroring(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerStatics4 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetForUser(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,__x_ABI_CWindows_CSystem_CIUser *user,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser **result) {
    return This->lpVtbl->GetForUser(This,user,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_ConfigureNotificationMirroring(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationMirroring value) {
    return This->lpVtbl->ConfigureNotificationMirroring(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerStatics4 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4
#define IToastNotificationManagerStatics4Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4Vtbl
#define IToastNotificationManagerStatics4 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4
#define IToastNotificationManagerStatics4_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_QueryInterface
#define IToastNotificationManagerStatics4_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_AddRef
#define IToastNotificationManagerStatics4_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_Release
#define IToastNotificationManagerStatics4_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetIids
#define IToastNotificationManagerStatics4_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetRuntimeClassName
#define IToastNotificationManagerStatics4_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetTrustLevel
#define IToastNotificationManagerStatics4_GetForUser __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_GetForUser
#define IToastNotificationManagerStatics4_ConfigureNotificationMirroring __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_ConfigureNotificationMirroring
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics4_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IToastNotificationManagerStatics5 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5, 0xd6f5f569, 0xd40d, 0x407c, 0x89,0x89, 0x88,0xca,0xb4,0x2c,0xfd,0x14);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("d6f5f569-d40d-407c-8989-88cab42cfd14")
                IToastNotificationManagerStatics5 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetDefault(
                        ABI::Windows::UI::Notifications::IToastNotificationManagerForUser **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5, 0xd6f5f569, 0xd40d, 0x407c, 0x89,0x89, 0x88,0xca,0xb4,0x2c,0xfd,0x14)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 *This,
        TrustLevel *trustLevel);

    /*** IToastNotificationManagerStatics5 methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDefault)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotificationManagerStatics5 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetDefault(This,result) (This)->lpVtbl->GetDefault(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotificationManagerStatics5 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetDefault(__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser **result) {
    return This->lpVtbl->GetDefault(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotificationManagerStatics5 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5
#define IToastNotificationManagerStatics5Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5Vtbl
#define IToastNotificationManagerStatics5 __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5
#define IToastNotificationManagerStatics5_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_QueryInterface
#define IToastNotificationManagerStatics5_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_AddRef
#define IToastNotificationManagerStatics5_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_Release
#define IToastNotificationManagerStatics5_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetIids
#define IToastNotificationManagerStatics5_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetRuntimeClassName
#define IToastNotificationManagerStatics5_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetTrustLevel
#define IToastNotificationManagerStatics5_GetDefault __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_GetDefault
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerStatics5_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotifier interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier, 0x75927b93, 0x03f3, 0x41ec, 0x91,0xd3, 0x6e,0x5b,0xac,0x1b,0x38,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("75927b93-03f3-41ec-91d3-6e5bac1b38e7")
                IToastNotifier : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE Show(
                        ABI::Windows::UI::Notifications::IToastNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Hide(
                        ABI::Windows::UI::Notifications::IToastNotification *notification) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Setting(
                        ABI::Windows::UI::Notifications::NotificationSetting *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE AddToSchedule(
                        ABI::Windows::UI::Notifications::IScheduledToastNotification *scheduled_toast) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RemoveFromSchedule(
                        ABI::Windows::UI::Notifications::IScheduledToastNotification *scheduled_toast) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetScheduledToastNotifications(
                        ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier, 0x75927b93, 0x03f3, 0x41ec, 0x91,0xd3, 0x6e,0x5b,0xac,0x1b,0x38,0xe7)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotifierVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        TrustLevel *trustLevel);

    /*** IToastNotifier methods ***/
    HRESULT (STDMETHODCALLTYPE *Show)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *notification);

    HRESULT (STDMETHODCALLTYPE *Hide)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *notification);

    HRESULT (STDMETHODCALLTYPE *get_Setting)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value);

    HRESULT (STDMETHODCALLTYPE *AddToSchedule)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *scheduled_toast);

    HRESULT (STDMETHODCALLTYPE *RemoveFromSchedule)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *scheduled_toast);

    HRESULT (STDMETHODCALLTYPE *GetScheduledToastNotifications)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotifierVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotifier methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Show(This,notification) (This)->lpVtbl->Show(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Hide(This,notification) (This)->lpVtbl->Hide(This,notification)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_get_Setting(This,value) (This)->lpVtbl->get_Setting(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddToSchedule(This,scheduled_toast) (This)->lpVtbl->AddToSchedule(This,scheduled_toast)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_RemoveFromSchedule(This,scheduled_toast) (This)->lpVtbl->RemoveFromSchedule(This,scheduled_toast)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetScheduledToastNotifications(This,result) (This)->lpVtbl->GetScheduledToastNotifications(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotifier methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Show(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *notification) {
    return This->lpVtbl->Show(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Hide(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *notification) {
    return This->lpVtbl->Hide(This,notification);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_get_Setting(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CNotificationSetting *value) {
    return This->lpVtbl->get_Setting(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddToSchedule(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *scheduled_toast) {
    return This->lpVtbl->AddToSchedule(This,scheduled_toast);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_RemoveFromSchedule(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *scheduled_toast) {
    return This->lpVtbl->RemoveFromSchedule(This,scheduled_toast);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetScheduledToastNotifications(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier* This,__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification **result) {
    return This->lpVtbl->GetScheduledToastNotifications(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotifier IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier
#define IToastNotifierVtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotifierVtbl
#define IToastNotifier __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier
#define IToastNotifier_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_QueryInterface
#define IToastNotifier_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddRef
#define IToastNotifier_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Release
#define IToastNotifier_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetIids
#define IToastNotifier_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetRuntimeClassName
#define IToastNotifier_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetTrustLevel
#define IToastNotifier_Show __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Show
#define IToastNotifier_Hide __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_Hide
#define IToastNotifier_get_Setting __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_get_Setting
#define IToastNotifier_AddToSchedule __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_AddToSchedule
#define IToastNotifier_RemoveFromSchedule __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_RemoveFromSchedule
#define IToastNotifier_GetScheduledToastNotifications __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_GetScheduledToastNotifications
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IToastNotifier2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2, 0x354389c6, 0x7c01, 0x4bd5, 0x9c,0x20, 0x60,0x43,0x40,0xcd,0x2b,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("354389c6-7c01-4bd5-9c20-604340cd2b74")
                IToastNotifier2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE UpdateWithTagAndGroup(
                        ABI::Windows::UI::Notifications::INotificationData *data,
                        HSTRING tag,
                        HSTRING group,
                        ABI::Windows::UI::Notifications::NotificationUpdateResult *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE UpdateWithTag(
                        ABI::Windows::UI::Notifications::INotificationData *data,
                        HSTRING tag,
                        ABI::Windows::UI::Notifications::NotificationUpdateResult *result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2, 0x354389c6, 0x7c01, 0x4bd5, 0x9c,0x20, 0x60,0x43,0x40,0xcd,0x2b,0x74)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This,
        TrustLevel *trustLevel);

    /*** IToastNotifier2 methods ***/
    HRESULT (STDMETHODCALLTYPE *UpdateWithTagAndGroup)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *data,
        HSTRING tag,
        HSTRING group,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult *result);

    HRESULT (STDMETHODCALLTYPE *UpdateWithTag)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationData *data,
        HSTRING tag,
        __x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult *result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotifier2 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTagAndGroup(This,data,tag,group,result) (This)->lpVtbl->UpdateWithTagAndGroup(This,data,tag,group,result)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTag(This,data,tag,result) (This)->lpVtbl->UpdateWithTag(This,data,tag,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotifier2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTagAndGroup(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationData *data,HSTRING tag,HSTRING group,__x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult *result) {
    return This->lpVtbl->UpdateWithTagAndGroup(This,data,tag,group,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTag(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationData *data,HSTRING tag,__x_ABI_CWindows_CUI_CNotifications_CNotificationUpdateResult *result) {
    return This->lpVtbl->UpdateWithTag(This,data,tag,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotifier2 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2
#define IToastNotifier2Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2Vtbl
#define IToastNotifier2 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2
#define IToastNotifier2_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_QueryInterface
#define IToastNotifier2_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_AddRef
#define IToastNotifier2_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_Release
#define IToastNotifier2_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetIids
#define IToastNotifier2_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetRuntimeClassName
#define IToastNotifier2_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_GetTrustLevel
#define IToastNotifier2_UpdateWithTagAndGroup __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTagAndGroup
#define IToastNotifier2_UpdateWithTag __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_UpdateWithTag
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*****************************************************************************
 * IToastNotifier3 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3, 0xae75a04a, 0x3b0c, 0x51ad, 0xb7,0xe8, 0xb0,0x8a,0xb6,0x05,0x25,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("ae75a04a-3b0c-51ad-b7e8-b08ab6052549")
                IToastNotifier3 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE add_ScheduledToastNotificationShowing(
                        ABI::Windows::Foundation::ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > *handler,
                        EventRegistrationToken *token) = 0;

                    virtual HRESULT STDMETHODCALLTYPE remove_ScheduledToastNotificationShowing(
                        EventRegistrationToken token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3, 0xae75a04a, 0x3b0c, 0x51ad, 0xb7,0xe8, 0xb0,0x8a,0xb6,0x05,0x25,0x49)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This,
        TrustLevel *trustLevel);

    /*** IToastNotifier3 methods ***/
    HRESULT (STDMETHODCALLTYPE *add_ScheduledToastNotificationShowing)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This,
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *handler,
        EventRegistrationToken *token);

    HRESULT (STDMETHODCALLTYPE *remove_ScheduledToastNotificationShowing)(
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 *This,
        EventRegistrationToken token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3Vtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3 {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IToastNotifier3 methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_add_ScheduledToastNotificationShowing(This,handler,token) (This)->lpVtbl->add_ScheduledToastNotificationShowing(This,handler,token)
#define __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_remove_ScheduledToastNotificationShowing(This,token) (This)->lpVtbl->remove_ScheduledToastNotificationShowing(This,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_Release(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IToastNotifier3 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_add_ScheduledToastNotificationShowing(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *handler,EventRegistrationToken *token) {
    return This->lpVtbl->add_ScheduledToastNotificationShowing(This,handler,token);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_remove_ScheduledToastNotificationShowing(__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3* This,EventRegistrationToken token) {
    return This->lpVtbl->remove_ScheduledToastNotificationShowing(This,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IToastNotifier3 IID___x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3
#define IToastNotifier3Vtbl __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3Vtbl
#define IToastNotifier3 __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3
#define IToastNotifier3_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_QueryInterface
#define IToastNotifier3_AddRef __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_AddRef
#define IToastNotifier3_Release __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_Release
#define IToastNotifier3_GetIids __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetIids
#define IToastNotifier3_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetRuntimeClassName
#define IToastNotifier3_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_GetTrustLevel
#define IToastNotifier3_add_ScheduledToastNotificationShowing __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_add_ScheduledToastNotificationShowing
#define IToastNotifier3_remove_ScheduledToastNotificationShowing __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_remove_ScheduledToastNotificationShowing
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIToastNotifier3_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*****************************************************************************
 * IUserNotification interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIUserNotification, 0xadf7e52f, 0x4e53, 0x42d5, 0x9c,0x33, 0xeb,0x5e,0xa5,0x15,0xb2,0x3e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("adf7e52f-4e53-42d5-9c33-eb5ea515b23e")
                IUserNotification : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Notification(
                        ABI::Windows::UI::Notifications::INotification **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_AppInfo(
                        ABI::Windows::ApplicationModel::IAppInfo **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Id(
                        UINT32 *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CreationTime(
                        ABI::Windows::Foundation::DateTime *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification, 0xadf7e52f, 0x4e53, 0x42d5, 0x9c,0x33, 0xeb,0x5e,0xa5,0x15,0xb2,0x3e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        TrustLevel *trustLevel);

    /*** IUserNotification methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Notification)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotification **value);

    HRESULT (STDMETHODCALLTYPE *get_AppInfo)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        __x_ABI_CWindows_CApplicationModel_CIAppInfo **value);

    HRESULT (STDMETHODCALLTYPE *get_Id)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *get_CreationTime)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *This,
        __x_ABI_CWindows_CFoundation_CDateTime *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotification {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUserNotification methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Notification(This,value) (This)->lpVtbl->get_Notification(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_AppInfo(This,value) (This)->lpVtbl->get_AppInfo(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Id(This,value) (This)->lpVtbl->get_Id(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_CreationTime(This,value) (This)->lpVtbl->get_CreationTime(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_Release(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUserNotification methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Notification(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,__x_ABI_CWindows_CUI_CNotifications_CINotification **value) {
    return This->lpVtbl->get_Notification(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_AppInfo(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,__x_ABI_CWindows_CApplicationModel_CIAppInfo **value) {
    return This->lpVtbl->get_AppInfo(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Id(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Id(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_CreationTime(__x_ABI_CWindows_CUI_CNotifications_CIUserNotification* This,__x_ABI_CWindows_CFoundation_CDateTime *value) {
    return This->lpVtbl->get_CreationTime(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IUserNotification IID___x_ABI_CWindows_CUI_CNotifications_CIUserNotification
#define IUserNotificationVtbl __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationVtbl
#define IUserNotification __x_ABI_CWindows_CUI_CNotifications_CIUserNotification
#define IUserNotification_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_QueryInterface
#define IUserNotification_AddRef __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_AddRef
#define IUserNotification_Release __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_Release
#define IUserNotification_GetIids __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetIids
#define IUserNotification_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetRuntimeClassName
#define IUserNotification_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_GetTrustLevel
#define IUserNotification_get_Notification __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Notification
#define IUserNotification_get_AppInfo __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_AppInfo
#define IUserNotification_get_Id __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_Id
#define IUserNotification_get_CreationTime __x_ABI_CWindows_CUI_CNotifications_CIUserNotification_get_CreationTime
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIUserNotification_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IUserNotificationChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs, 0xb6bd6839, 0x79cf, 0x4b25, 0x82,0xc0, 0x0c,0xe1,0xee,0xf8,0x1f,0x8c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Notifications {
                MIDL_INTERFACE("b6bd6839-79cf-4b25-82c0-0ce1eef81f8c")
                IUserNotificationChangedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_ChangeKind(
                        ABI::Windows::UI::Notifications::UserNotificationChangedKind *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_UserNotificationId(
                        UINT32 *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs, 0xb6bd6839, 0x79cf, 0x4b25, 0x82,0xc0, 0x0c,0xe1,0xee,0xf8,0x1f,0x8c)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IUserNotificationChangedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ChangeKind)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind *value);

    HRESULT (STDMETHODCALLTYPE *get_UserNotificationId)(
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs *This,
        UINT32 *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUserNotificationChangedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_ChangeKind(This,value) (This)->lpVtbl->get_ChangeKind(This,value)
#define __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_UserNotificationId(This,value) (This)->lpVtbl->get_UserNotificationId(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_AddRef(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_Release(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetIids(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUserNotificationChangedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_ChangeKind(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CUserNotificationChangedKind *value) {
    return This->lpVtbl->get_ChangeKind(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_UserNotificationId(__x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs* This,UINT32 *value) {
    return This->lpVtbl->get_UserNotificationId(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Notifications
#define IID_IUserNotificationChangedEventArgs IID___x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs
#define IUserNotificationChangedEventArgsVtbl __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgsVtbl
#define IUserNotificationChangedEventArgs __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs
#define IUserNotificationChangedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_QueryInterface
#define IUserNotificationChangedEventArgs_AddRef __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_AddRef
#define IUserNotificationChangedEventArgs_Release __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_Release
#define IUserNotificationChangedEventArgs_GetIids __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetIids
#define IUserNotificationChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetRuntimeClassName
#define IUserNotificationChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_GetTrustLevel
#define IUserNotificationChangedEventArgs_get_ChangeKind __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_ChangeKind
#define IUserNotificationChangedEventArgs_get_UserNotificationId __x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_get_UserNotificationId
#endif /* WIDL_using_Windows_UI_Notifications */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CNotifications_CIUserNotificationChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.AdaptiveNotificationText
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_AdaptiveNotificationText_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_AdaptiveNotificationText_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_AdaptiveNotificationText[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','T','e','x','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_AdaptiveNotificationText[] = L"Windows.UI.Notifications.AdaptiveNotificationText";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_AdaptiveNotificationText[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','T','e','x','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_AdaptiveNotificationText_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.BadgeNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_BadgeNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_BadgeNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_BadgeNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeNotification[] = L"Windows.UI.Notifications.BadgeNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_BadgeNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.BadgeUpdateManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManager[] = L"Windows.UI.Notifications.BadgeUpdateManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.BadgeUpdateManagerForUser
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManagerForUser_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManagerForUser_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManagerForUser[] = L"Windows.UI.Notifications.BadgeUpdateManagerForUser";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdateManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdateManagerForUser_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.BadgeUpdater
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdater_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdater_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdater[] = L"Windows.UI.Notifications.BadgeUpdater";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_BadgeUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','B','a','d','g','e','U','p','d','a','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_BadgeUpdater_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.KnownAdaptiveNotificationHints
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationHints_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationHints_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationHints[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','H','i','n','t','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationHints[] = L"Windows.UI.Notifications.KnownAdaptiveNotificationHints";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationHints[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','H','i','n','t','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationHints_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.KnownAdaptiveNotificationTextStyles
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','T','e','x','t','S','t','y','l','e','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles[] = L"Windows.UI.Notifications.KnownAdaptiveNotificationTextStyles";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','A','d','a','p','t','i','v','e','N','o','t','i','f','i','c','a','t','i','o','n','T','e','x','t','S','t','y','l','e','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_KnownAdaptiveNotificationTextStyles_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.KnownNotificationBindings
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_KnownNotificationBindings_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_KnownNotificationBindings_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_KnownNotificationBindings[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','N','o','t','i','f','i','c','a','t','i','o','n','B','i','n','d','i','n','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownNotificationBindings[] = L"Windows.UI.Notifications.KnownNotificationBindings";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_KnownNotificationBindings[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','K','n','o','w','n','N','o','t','i','f','i','c','a','t','i','o','n','B','i','n','d','i','n','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_KnownNotificationBindings_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.Notification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_Notification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_Notification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_Notification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_Notification[] = L"Windows.UI.Notifications.Notification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_Notification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_Notification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.NotificationBinding
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_NotificationBinding_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_NotificationBinding_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_NotificationBinding[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','B','i','n','d','i','n','g',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationBinding[] = L"Windows.UI.Notifications.NotificationBinding";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationBinding[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','B','i','n','d','i','n','g',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_NotificationBinding_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.NotificationData
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_NotificationData_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_NotificationData_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_NotificationData[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','D','a','t','a',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationData[] = L"Windows.UI.Notifications.NotificationData";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationData[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','D','a','t','a',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_NotificationData_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.UI.Notifications.NotificationVisual
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_NotificationVisual_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_NotificationVisual_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_NotificationVisual[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','V','i','s','u','a','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationVisual[] = L"Windows.UI.Notifications.NotificationVisual";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_NotificationVisual[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','N','o','t','i','f','i','c','a','t','i','o','n','V','i','s','u','a','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_NotificationVisual_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.ScheduledTileNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ScheduledTileNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ScheduledTileNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledTileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledTileNotification[] = L"Windows.UI.Notifications.ScheduledTileNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledTileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ScheduledTileNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ScheduledToastNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotification[] = L"Windows.UI.Notifications.ScheduledToastNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ScheduledToastNotificationShowingEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','S','h','o','w','i','n','g','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs[] = L"Windows.UI.Notifications.ScheduledToastNotificationShowingEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','c','h','e','d','u','l','e','d','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','S','h','o','w','i','n','g','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ScheduledToastNotificationShowingEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x70000 */

/*
 * Class Windows.UI.Notifications.ShownTileNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ShownTileNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ShownTileNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ShownTileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','h','o','w','n','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ShownTileNotification[] = L"Windows.UI.Notifications.ShownTileNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ShownTileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','S','h','o','w','n','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ShownTileNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.TileFlyoutNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutNotification[] = L"Windows.UI.Notifications.TileFlyoutNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileFlyoutUpdateManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdateManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdateManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdateManager[] = L"Windows.UI.Notifications.TileFlyoutUpdateManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdateManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileFlyoutUpdater
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdater_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdater_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','U','p','d','a','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdater[] = L"Windows.UI.Notifications.TileFlyoutUpdater";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileFlyoutUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','F','l','y','o','u','t','U','p','d','a','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileFlyoutUpdater_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileNotification[] = L"Windows.UI.Notifications.TileNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileUpdateManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManager[] = L"Windows.UI.Notifications.TileUpdateManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.TileUpdateManagerForUser
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManagerForUser_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManagerForUser_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManagerForUser[] = L"Windows.UI.Notifications.TileUpdateManagerForUser";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdateManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileUpdateManagerForUser_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.TileUpdater
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_TileUpdater_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_TileUpdater_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdater[] = L"Windows.UI.Notifications.TileUpdater";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_TileUpdater[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','i','l','e','U','p','d','a','t','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_TileUpdater_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastActivatedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastActivatedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastActivatedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastActivatedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','A','c','t','i','v','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastActivatedEventArgs[] = L"Windows.UI.Notifications.ToastActivatedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastActivatedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','A','c','t','i','v','a','t','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastActivatedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastCollection
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastCollection_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastCollection_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollection[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','C','o','l','l','e','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollection[] = L"Windows.UI.Notifications.ToastCollection";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollection[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','C','o','l','l','e','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastCollection_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.UI.Notifications.ToastCollectionManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastCollectionManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastCollectionManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollectionManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','C','o','l','l','e','c','t','i','o','n','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollectionManager[] = L"Windows.UI.Notifications.ToastCollectionManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastCollectionManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','C','o','l','l','e','c','t','i','o','n','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastCollectionManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x40000 */

/*
 * Class Windows.UI.Notifications.ToastDismissedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastDismissedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastDismissedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastDismissedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','D','i','s','m','i','s','s','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastDismissedEventArgs[] = L"Windows.UI.Notifications.ToastDismissedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastDismissedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','D','i','s','m','i','s','s','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastDismissedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastFailedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastFailedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastFailedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastFailedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','F','a','i','l','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastFailedEventArgs[] = L"Windows.UI.Notifications.ToastFailedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastFailedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','F','a','i','l','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastFailedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotification[] = L"Windows.UI.Notifications.ToastNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationActionTriggerDetail
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationActionTriggerDetail_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationActionTriggerDetail_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationActionTriggerDetail[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','A','c','t','i','o','n','T','r','i','g','g','e','r','D','e','t','a','i','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationActionTriggerDetail[] = L"Windows.UI.Notifications.ToastNotificationActionTriggerDetail";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationActionTriggerDetail[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','A','c','t','i','o','n','T','r','i','g','g','e','r','D','e','t','a','i','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationActionTriggerDetail_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationHistory
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistory_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistory_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistory[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','H','i','s','t','o','r','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistory[] = L"Windows.UI.Notifications.ToastNotificationHistory";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistory[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','H','i','s','t','o','r','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistory_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationHistoryChangedTriggerDetail
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','H','i','s','t','o','r','y','C','h','a','n','g','e','d','T','r','i','g','g','e','r','D','e','t','a','i','l',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail[] = L"Windows.UI.Notifications.ToastNotificationHistoryChangedTriggerDetail";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','H','i','s','t','o','r','y','C','h','a','n','g','e','d','T','r','i','g','g','e','r','D','e','t','a','i','l',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationHistoryChangedTriggerDetail_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationManager
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManager_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManager_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','M','a','n','a','g','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManager[] = L"Windows.UI.Notifications.ToastNotificationManager";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManager[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','M','a','n','a','g','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManager_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.ToastNotificationManagerForUser
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManagerForUser_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManagerForUser_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManagerForUser[] = L"Windows.UI.Notifications.ToastNotificationManagerForUser";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotificationManagerForUser[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','c','a','t','i','o','n','M','a','n','a','g','e','r','F','o','r','U','s','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotificationManagerForUser_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.ToastNotifier
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_ToastNotifier_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_ToastNotifier_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotifier[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotifier[] = L"Windows.UI.Notifications.ToastNotifier";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_ToastNotifier[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','T','o','a','s','t','N','o','t','i','f','i','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_ToastNotifier_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Notifications.UserNotification
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_UserNotification_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_UserNotification_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_UserNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','U','s','e','r','N','o','t','i','f','i','c','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_UserNotification[] = L"Windows.UI.Notifications.UserNotification";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_UserNotification[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','U','s','e','r','N','o','t','i','f','i','c','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_UserNotification_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*
 * Class Windows.UI.Notifications.UserNotificationChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000
#ifndef RUNTIMECLASS_Windows_UI_Notifications_UserNotificationChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Notifications_UserNotificationChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Notifications_UserNotificationChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','U','s','e','r','N','o','t','i','f','i','c','a','t','i','o','n','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_UserNotificationChangedEventArgs[] = L"Windows.UI.Notifications.UserNotificationChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Notifications_UserNotificationChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','N','o','t','i','f','i','c','a','t','i','o','n','s','.','U','s','e','r','N','o','t','i','f','i','c','a','t','i','o','n','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Notifications_UserNotificationChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x30000 */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0x0343e8f2, 0xca4c, 0x5f40, 0xb8,0xd1, 0x3f,0xf4,0x70,0x47,0xce,0x43);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("0343e8f2-ca4c-5f40-b8d1-3ff47047ce43")
                IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::AdaptiveNotificationText*, ABI::Windows::UI::Notifications::IAdaptiveNotificationText* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0x0343e8f2, 0xca4c, 0x5f40, 0xb8,0xd1, 0x3f,0xf4,0x70,0x47,0xce,0x43)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_First(__FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_AdaptiveNotificationText IID___FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IIterable_AdaptiveNotificationTextVtbl __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl
#define IIterable_AdaptiveNotificationText __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IIterable_AdaptiveNotificationText_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface
#define IIterable_AdaptiveNotificationText_AddRef __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef
#define IIterable_AdaptiveNotificationText_Release __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release
#define IIterable_AdaptiveNotificationText_GetIids __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids
#define IIterable_AdaptiveNotificationText_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName
#define IIterable_AdaptiveNotificationText_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel
#define IIterable_AdaptiveNotificationText_First __FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding, 0xe8d9489c, 0x635e, 0x5153, 0x8a,0xb7, 0x38,0x9f,0x2e,0xe9,0xfa,0xca);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("e8d9489c-635e-5153-8ab7-389f2ee9faca")
                IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::NotificationBinding*, ABI::Windows::UI::Notifications::INotificationBinding* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding, 0xe8d9489c, 0x635e, 0x5153, 0x8a,0xb7, 0x38,0x9f,0x2e,0xe9,0xfa,0xca)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CNotificationBindingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CNotificationBindingVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CNotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_Release(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_First(__FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding* This,__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_NotificationBinding IID___FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding
#define IIterable_NotificationBindingVtbl __FIIterable_1_Windows__CUI__CNotifications__CNotificationBindingVtbl
#define IIterable_NotificationBinding __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding
#define IIterable_NotificationBinding_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface
#define IIterable_NotificationBinding_AddRef __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef
#define IIterable_NotificationBinding_Release __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_Release
#define IIterable_NotificationBinding_GetIids __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids
#define IIterable_NotificationBinding_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName
#define IIterable_NotificationBinding_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel
#define IIterable_NotificationBinding_First __FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x4b60d1e5, 0x52ae, 0x5766, 0x97,0x20, 0xbe,0x4a,0xd0,0x86,0xf9,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("4b60d1e5-52ae-5766-9720-be4ad086f952")
                IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledTileNotification*, ABI::Windows::UI::Notifications::IScheduledTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x4b60d1e5, 0x52ae, 0x5766, 0x97,0x20, 0xbe,0x4a,0xd0,0x86,0xf9,0x52)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ScheduledTileNotification IID___FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IIterable_ScheduledTileNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl
#define IIterable_ScheduledTileNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IIterable_ScheduledTileNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface
#define IIterable_ScheduledTileNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef
#define IIterable_ScheduledTileNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release
#define IIterable_ScheduledTileNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids
#define IIterable_ScheduledTileNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName
#define IIterable_ScheduledTileNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel
#define IIterable_ScheduledTileNotification_First __FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0x7a7b2a51, 0xc182, 0x5846, 0xa8,0x61, 0x4f,0x9c,0x03,0x6f,0x24,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("7a7b2a51-c182-5846-a861-4f9c036f24ad")
                IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledToastNotification*, ABI::Windows::UI::Notifications::IScheduledToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0x7a7b2a51, 0xc182, 0x5846, 0xa8,0x61, 0x4f,0x9c,0x03,0x6f,0x24,0xad)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ScheduledToastNotification IID___FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IIterable_ScheduledToastNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl
#define IIterable_ScheduledToastNotification __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IIterable_ScheduledToastNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface
#define IIterable_ScheduledToastNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef
#define IIterable_ScheduledToastNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release
#define IIterable_ScheduledToastNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids
#define IIterable_ScheduledToastNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName
#define IIterable_ScheduledToastNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel
#define IIterable_ScheduledToastNotification_First __FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification, 0x1863baee, 0x44f1, 0x5e51, 0xbc,0xdf, 0xa3,0xcd,0xab,0x82,0x6a,0x15);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1863baee-44f1-5e51-bcdf-a3cdab826a15")
                IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ShownTileNotification*, ABI::Windows::UI::Notifications::IShownTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification, 0x1863baee, 0x44f1, 0x5e51, 0xbc,0xdf, 0xa3,0xcd,0xab,0x82,0x6a,0x15)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ShownTileNotification IID___FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification
#define IIterable_ShownTileNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl
#define IIterable_ShownTileNotification __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification
#define IIterable_ShownTileNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface
#define IIterable_ShownTileNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef
#define IIterable_ShownTileNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_Release
#define IIterable_ShownTileNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids
#define IIterable_ShownTileNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName
#define IIterable_ShownTileNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel
#define IIterable_ShownTileNotification_First __FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CToastCollection, 0x8928d527, 0xdb5d, 0x5a10, 0xae,0x9b, 0x43,0x0f,0xa0,0x90,0x6e,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("8928d527-db5d-5a10-ae9b-430fa0906e74")
                IIterable<ABI::Windows::UI::Notifications::ToastCollection* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection, 0x8928d527, 0xdb5d, 0x5a10, 0xae,0x9b, 0x43,0x0f,0xa0,0x90,0x6e,0x74)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastCollection *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastCollection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastCollection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastCollection *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_First(__FIIterable_1_Windows__CUI__CNotifications__CToastCollection* This,__FIIterator_1_Windows__CUI__CNotifications__CToastCollection **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ToastCollection IID___FIIterable_1_Windows__CUI__CNotifications__CToastCollection
#define IIterable_ToastCollectionVtbl __FIIterable_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IIterable_ToastCollection __FIIterable_1_Windows__CUI__CNotifications__CToastCollection
#define IIterable_ToastCollection_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IIterable_ToastCollection_AddRef __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IIterable_ToastCollection_Release __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IIterable_ToastCollection_GetIids __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IIterable_ToastCollection_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IIterable_ToastCollection_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IIterable_ToastCollection_First __FIIterable_1_Windows__CUI__CNotifications__CToastCollection_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::ToastNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CToastNotification, 0x52c9428b, 0xd37a, 0x554d, 0xbf,0x55, 0xb8,0x68,0x5d,0x5f,0x55,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("52c9428b-d37a-554d-bf55-b8685d5f552d")
                IIterable<ABI::Windows::UI::Notifications::ToastNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification, 0x52c9428b, 0xd37a, 0x554d, 0xbf,0x55, 0xb8,0x68,0x5d,0x5f,0x55,0x2d)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CToastNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastNotification *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CToastNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CToastNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CToastNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CToastNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CToastNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_ToastNotification IID___FIIterable_1_Windows__CUI__CNotifications__CToastNotification
#define IIterable_ToastNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CToastNotificationVtbl
#define IIterable_ToastNotification __FIIterable_1_Windows__CUI__CNotifications__CToastNotification
#define IIterable_ToastNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface
#define IIterable_ToastNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_AddRef
#define IIterable_ToastNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_Release
#define IIterable_ToastNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetIids
#define IIterable_ToastNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName
#define IIterable_ToastNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel
#define IIterable_ToastNotification_First __FIIterable_1_Windows__CUI__CNotifications__CToastNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterable<ABI::Windows::UI::Notifications::UserNotification* > interface
 */
#ifndef ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CUI__CNotifications__CUserNotification, 0x18170480, 0x1bd8, 0x5cd0, 0xbb,0x32, 0x67,0xe7,0x1d,0x5b,0x4d,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("18170480-1bd8-5cd0-bb32-67e71d5b4d7c")
                IIterable<ABI::Windows::UI::Notifications::UserNotification* > : IIterable_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::UserNotification*, ABI::Windows::UI::Notifications::IUserNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification, 0x18170480, 0x1bd8, 0x5cd0, 0xbb,0x32, 0x67,0xe7,0x1d,0x5b,0x4d,0x7c)
#endif
#else
typedef struct __FIIterable_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CUI__CNotifications__CUserNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CUI__CNotifications__CUserNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CUI__CNotifications__CUserNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CUI__CNotifications__CUserNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CUI__CNotifications__CUserNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CUI__CNotifications__CUserNotification *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification **value);

    END_INTERFACE
} __FIIterable_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIIterable_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIIterable_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
#define __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetIids(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
static inline HRESULT __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_First(__FIIterable_1_Windows__CUI__CNotifications__CUserNotification* This,__FIIterator_1_Windows__CUI__CNotifications__CUserNotification **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_UserNotification IID___FIIterable_1_Windows__CUI__CNotifications__CUserNotification
#define IIterable_UserNotificationVtbl __FIIterable_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IIterable_UserNotification __FIIterable_1_Windows__CUI__CNotifications__CUserNotification
#define IIterable_UserNotification_QueryInterface __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IIterable_UserNotification_AddRef __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IIterable_UserNotification_Release __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IIterable_UserNotification_GetIids __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetIids
#define IIterable_UserNotification_GetRuntimeClassName __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName
#define IIterable_UserNotification_GetTrustLevel __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel
#define IIterable_UserNotification_First __FIIterable_1_Windows__CUI__CNotifications__CUserNotification_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0x18015daa, 0xcbc3, 0x5a51, 0x9f,0x4b, 0x3c,0x06,0x91,0x35,0xb0,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("18015daa-cbc3-5a51-9f4b-3c069135b0e0")
                IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::AdaptiveNotificationText*, ABI::Windows::UI::Notifications::IAdaptiveNotificationText* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0x18015daa, 0xcbc3, 0x5a51, 0x9f,0x4b, 0x3c,0x06,0x91,0x35,0xb0,0xe0)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_AdaptiveNotificationText IID___FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IIterator_AdaptiveNotificationTextVtbl __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl
#define IIterator_AdaptiveNotificationText __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IIterator_AdaptiveNotificationText_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface
#define IIterator_AdaptiveNotificationText_AddRef __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef
#define IIterator_AdaptiveNotificationText_Release __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release
#define IIterator_AdaptiveNotificationText_GetIids __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids
#define IIterator_AdaptiveNotificationText_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName
#define IIterator_AdaptiveNotificationText_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel
#define IIterator_AdaptiveNotificationText_get_Current __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Current
#define IIterator_AdaptiveNotificationText_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_HasCurrent
#define IIterator_AdaptiveNotificationText_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_MoveNext
#define IIterator_AdaptiveNotificationText_GetMany __FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding, 0x66187f56, 0x9ee1, 0x5c48, 0x82,0xda, 0x6c,0xb9,0xdd,0xf8,0x79,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("66187f56-9ee1-5c48-82da-6cb9ddf879e7")
                IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::NotificationBinding*, ABI::Windows::UI::Notifications::INotificationBinding* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding, 0x66187f56, 0x9ee1, 0x5c48, 0x82,0xda, 0x6c,0xb9,0xdd,0xf8,0x79,0xe7)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CNotificationBindingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CNotificationBindingVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CNotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_Release(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_NotificationBinding IID___FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding
#define IIterator_NotificationBindingVtbl __FIIterator_1_Windows__CUI__CNotifications__CNotificationBindingVtbl
#define IIterator_NotificationBinding __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding
#define IIterator_NotificationBinding_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface
#define IIterator_NotificationBinding_AddRef __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef
#define IIterator_NotificationBinding_Release __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_Release
#define IIterator_NotificationBinding_GetIids __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids
#define IIterator_NotificationBinding_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName
#define IIterator_NotificationBinding_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel
#define IIterator_NotificationBinding_get_Current __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_Current
#define IIterator_NotificationBinding_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_get_HasCurrent
#define IIterator_NotificationBinding_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_MoveNext
#define IIterator_NotificationBinding_GetMany __FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x5665e491, 0x6543, 0x5036, 0x93,0x5f, 0xb5,0x15,0x79,0x50,0xb3,0x59);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("5665e491-6543-5036-935f-b5157950b359")
                IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledTileNotification*, ABI::Windows::UI::Notifications::IScheduledTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x5665e491, 0x6543, 0x5036, 0x93,0x5f, 0xb5,0x15,0x79,0x50,0xb3,0x59)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ScheduledTileNotification IID___FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IIterator_ScheduledTileNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl
#define IIterator_ScheduledTileNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IIterator_ScheduledTileNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface
#define IIterator_ScheduledTileNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef
#define IIterator_ScheduledTileNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release
#define IIterator_ScheduledTileNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids
#define IIterator_ScheduledTileNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName
#define IIterator_ScheduledTileNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel
#define IIterator_ScheduledTileNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Current
#define IIterator_ScheduledTileNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_HasCurrent
#define IIterator_ScheduledTileNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_MoveNext
#define IIterator_ScheduledTileNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0x304238b6, 0x888a, 0x5dd2, 0x96,0xcd, 0xbf,0xca,0x89,0x27,0x48,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("304238b6-888a-5dd2-96cd-bfca8927483b")
                IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledToastNotification*, ABI::Windows::UI::Notifications::IScheduledToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0x304238b6, 0x888a, 0x5dd2, 0x96,0xcd, 0xbf,0xca,0x89,0x27,0x48,0x3b)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ScheduledToastNotification IID___FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IIterator_ScheduledToastNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl
#define IIterator_ScheduledToastNotification __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IIterator_ScheduledToastNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface
#define IIterator_ScheduledToastNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef
#define IIterator_ScheduledToastNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release
#define IIterator_ScheduledToastNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids
#define IIterator_ScheduledToastNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName
#define IIterator_ScheduledToastNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel
#define IIterator_ScheduledToastNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Current
#define IIterator_ScheduledToastNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_HasCurrent
#define IIterator_ScheduledToastNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_MoveNext
#define IIterator_ScheduledToastNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification, 0x04d8d70b, 0x7c15, 0x5f60, 0x98,0x94, 0xb2,0x13,0x66,0xb4,0x27,0xc2);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("04d8d70b-7c15-5f60-9894-b21366b427c2")
                IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ShownTileNotification*, ABI::Windows::UI::Notifications::IShownTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification, 0x04d8d70b, 0x7c15, 0x5f60, 0x98,0x94, 0xb2,0x13,0x66,0xb4,0x27,0xc2)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ShownTileNotification IID___FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification
#define IIterator_ShownTileNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl
#define IIterator_ShownTileNotification __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification
#define IIterator_ShownTileNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface
#define IIterator_ShownTileNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef
#define IIterator_ShownTileNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_Release
#define IIterator_ShownTileNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids
#define IIterator_ShownTileNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName
#define IIterator_ShownTileNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel
#define IIterator_ShownTileNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_Current
#define IIterator_ShownTileNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_get_HasCurrent
#define IIterator_ShownTileNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_MoveNext
#define IIterator_ShownTileNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CToastCollection, 0x1512ed75, 0x8c74, 0x5520, 0xac,0x88, 0x13,0x4a,0x14,0x03,0xf7,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("1512ed75-8c74-5520-ac88-134a1403f7ad")
                IIterator<ABI::Windows::UI::Notifications::ToastCollection* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection, 0x1512ed75, 0x8c74, 0x5520, 0xac,0x88, 0x13,0x4a,0x14,0x03,0xf7,0xad)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastCollection *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CToastCollection* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ToastCollection IID___FIIterator_1_Windows__CUI__CNotifications__CToastCollection
#define IIterator_ToastCollectionVtbl __FIIterator_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IIterator_ToastCollection __FIIterator_1_Windows__CUI__CNotifications__CToastCollection
#define IIterator_ToastCollection_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IIterator_ToastCollection_AddRef __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IIterator_ToastCollection_Release __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IIterator_ToastCollection_GetIids __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IIterator_ToastCollection_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IIterator_ToastCollection_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IIterator_ToastCollection_get_Current __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_Current
#define IIterator_ToastCollection_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_get_HasCurrent
#define IIterator_ToastCollection_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_MoveNext
#define IIterator_ToastCollection_GetMany __FIIterator_1_Windows__CUI__CNotifications__CToastCollection_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::ToastNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CToastNotification, 0xfe1e726a, 0x3aa9, 0x5d98, 0xb1,0x9b, 0x97,0xe3,0xe1,0x7e,0xec,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("fe1e726a-3aa9-5d98-b19b-97e3e17eec7b")
                IIterator<ABI::Windows::UI::Notifications::ToastNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification, 0xfe1e726a, 0x3aa9, 0x5d98, 0xb1,0x9b, 0x97,0xe3,0xe1,0x7e,0xec,0x7b)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CToastNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CToastNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CToastNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CToastNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CToastNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_ToastNotification IID___FIIterator_1_Windows__CUI__CNotifications__CToastNotification
#define IIterator_ToastNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CToastNotificationVtbl
#define IIterator_ToastNotification __FIIterator_1_Windows__CUI__CNotifications__CToastNotification
#define IIterator_ToastNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface
#define IIterator_ToastNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_AddRef
#define IIterator_ToastNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_Release
#define IIterator_ToastNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetIids
#define IIterator_ToastNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName
#define IIterator_ToastNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel
#define IIterator_ToastNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_Current
#define IIterator_ToastNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_get_HasCurrent
#define IIterator_ToastNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_MoveNext
#define IIterator_ToastNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CToastNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::UI::Notifications::UserNotification* > interface
 */
#ifndef ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CUI__CNotifications__CUserNotification, 0x6ee1200d, 0xdd13, 0x5050, 0x88,0xcb, 0x53,0x52,0xaf,0x11,0x3f,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("6ee1200d-dd13-5050-88cb-5352af113fd1")
                IIterator<ABI::Windows::UI::Notifications::UserNotification* > : IIterator_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::UserNotification*, ABI::Windows::UI::Notifications::IUserNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification, 0x6ee1200d, 0xdd13, 0x5050, 0x88,0xcb, 0x53,0x52,0xaf,0x11,0x3f,0xd1)
#endif
#else
typedef struct __FIIterator_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CUI__CNotifications__CUserNotification *This,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIIterator_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIIterator_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetIids(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_Current(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification **value) {
    return This->lpVtbl->get_Current(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_HasCurrent(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_MoveNext(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static inline HRESULT __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetMany(__FIIterator_1_Windows__CUI__CNotifications__CUserNotification* This,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_UserNotification IID___FIIterator_1_Windows__CUI__CNotifications__CUserNotification
#define IIterator_UserNotificationVtbl __FIIterator_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IIterator_UserNotification __FIIterator_1_Windows__CUI__CNotifications__CUserNotification
#define IIterator_UserNotification_QueryInterface __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IIterator_UserNotification_AddRef __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IIterator_UserNotification_Release __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IIterator_UserNotification_GetIids __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetIids
#define IIterator_UserNotification_GetRuntimeClassName __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName
#define IIterator_UserNotification_GetTrustLevel __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel
#define IIterator_UserNotification_get_Current __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_Current
#define IIterator_UserNotification_get_HasCurrent __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_get_HasCurrent
#define IIterator_UserNotification_MoveNext __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_MoveNext
#define IIterator_UserNotification_GetMany __FIIterator_1_Windows__CUI__CNotifications__CUserNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0xb60de92b, 0x4e12, 0x55af, 0xb4,0x2f, 0xaf,0xe2,0xd7,0x0b,0xa2,0x78);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("b60de92b-4e12-55af-b42f-afe2d70ba278")
                IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::AdaptiveNotificationText*, ABI::Windows::UI::Notifications::IAdaptiveNotificationText* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText, 0xb60de92b, 0x4e12, 0x55af, 0xb4,0x2f, 0xaf,0xe2,0xd7,0x0b,0xa2,0x78)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::AdaptiveNotificationText* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIAdaptiveNotificationText **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_AdaptiveNotificationText IID___FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IVectorView_AdaptiveNotificationTextVtbl __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationTextVtbl
#define IVectorView_AdaptiveNotificationText __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText
#define IVectorView_AdaptiveNotificationText_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_QueryInterface
#define IVectorView_AdaptiveNotificationText_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_AddRef
#define IVectorView_AdaptiveNotificationText_Release __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_Release
#define IVectorView_AdaptiveNotificationText_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetIids
#define IVectorView_AdaptiveNotificationText_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetRuntimeClassName
#define IVectorView_AdaptiveNotificationText_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetTrustLevel
#define IVectorView_AdaptiveNotificationText_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetAt
#define IVectorView_AdaptiveNotificationText_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_get_Size
#define IVectorView_AdaptiveNotificationText_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_IndexOf
#define IVectorView_AdaptiveNotificationText_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CAdaptiveNotificationText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding, 0x9e4d0240, 0x6d5c, 0x582a, 0xa2,0x9d, 0x73,0x4e,0x84,0x75,0x07,0x38);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("9e4d0240-6d5c-582a-a29d-734e84750738")
                IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::NotificationBinding*, ABI::Windows::UI::Notifications::INotificationBinding* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding, 0x9e4d0240, 0x6d5c, 0x582a, 0xa2,0x9d, 0x73,0x4e,0x84,0x75,0x07,0x38)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBindingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBindingVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_Release(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_NotificationBinding IID___FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding
#define IVectorView_NotificationBindingVtbl __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBindingVtbl
#define IVectorView_NotificationBinding __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding
#define IVectorView_NotificationBinding_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface
#define IVectorView_NotificationBinding_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef
#define IVectorView_NotificationBinding_Release __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_Release
#define IVectorView_NotificationBinding_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids
#define IVectorView_NotificationBinding_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName
#define IVectorView_NotificationBinding_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel
#define IVectorView_NotificationBinding_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt
#define IVectorView_NotificationBinding_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size
#define IVectorView_NotificationBinding_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf
#define IVectorView_NotificationBinding_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x4f729c64, 0xa213, 0x52e9, 0xaf,0x8b, 0x58,0xad,0xca,0x3e,0x59,0x7f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("4f729c64-a213-52e9-af8b-58adca3e597f")
                IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledTileNotification*, ABI::Windows::UI::Notifications::IScheduledTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification, 0x4f729c64, 0xa213, 0x52e9, 0xaf,0x8b, 0x58,0xad,0xca,0x3e,0x59,0x7f)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ScheduledTileNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIScheduledTileNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ScheduledTileNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IVectorView_ScheduledTileNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotificationVtbl
#define IVectorView_ScheduledTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification
#define IVectorView_ScheduledTileNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_QueryInterface
#define IVectorView_ScheduledTileNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_AddRef
#define IVectorView_ScheduledTileNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_Release
#define IVectorView_ScheduledTileNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetIids
#define IVectorView_ScheduledTileNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetRuntimeClassName
#define IVectorView_ScheduledTileNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetTrustLevel
#define IVectorView_ScheduledTileNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetAt
#define IVectorView_ScheduledTileNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_get_Size
#define IVectorView_ScheduledTileNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_IndexOf
#define IVectorView_ScheduledTileNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0xba0aff1f, 0x6a8a, 0x5a7e, 0xa9,0xf7, 0x50,0x5b,0x62,0x66,0xa4,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("ba0aff1f-6a8a-5a7e-a9f7-505b6266a436")
                IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledToastNotification*, ABI::Windows::UI::Notifications::IScheduledToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification, 0xba0aff1f, 0x6a8a, 0x5a7e, 0xa9,0xf7, 0x50,0x5b,0x62,0x66,0xa4,0x36)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ScheduledToastNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ScheduledToastNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IVectorView_ScheduledToastNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotificationVtbl
#define IVectorView_ScheduledToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification
#define IVectorView_ScheduledToastNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_QueryInterface
#define IVectorView_ScheduledToastNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_AddRef
#define IVectorView_ScheduledToastNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_Release
#define IVectorView_ScheduledToastNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetIids
#define IVectorView_ScheduledToastNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetRuntimeClassName
#define IVectorView_ScheduledToastNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetTrustLevel
#define IVectorView_ScheduledToastNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetAt
#define IVectorView_ScheduledToastNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_get_Size
#define IVectorView_ScheduledToastNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_IndexOf
#define IVectorView_ScheduledToastNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CScheduledToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification, 0x2b23baa9, 0x1d54, 0x5440, 0xbd,0x32, 0x86,0xed,0x70,0xf1,0x5c,0x9e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("2b23baa9-1d54-5440-bd32-86ed70f15c9e")
                IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ShownTileNotification*, ABI::Windows::UI::Notifications::IShownTileNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification, 0x2b23baa9, 0x1d54, 0x5440, 0xbd,0x32, 0x86,0xed,0x70,0xf1,0x5c,0x9e)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ShownTileNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIShownTileNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ShownTileNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification
#define IVectorView_ShownTileNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotificationVtbl
#define IVectorView_ShownTileNotification __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification
#define IVectorView_ShownTileNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_QueryInterface
#define IVectorView_ShownTileNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_AddRef
#define IVectorView_ShownTileNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_Release
#define IVectorView_ShownTileNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetIids
#define IVectorView_ShownTileNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetRuntimeClassName
#define IVectorView_ShownTileNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetTrustLevel
#define IVectorView_ShownTileNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetAt
#define IVectorView_ShownTileNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_get_Size
#define IVectorView_ShownTileNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_IndexOf
#define IVectorView_ShownTileNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CShownTileNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0xe09d090a, 0x12e2, 0x569b, 0xad,0x29, 0xfb,0x0d,0xfb,0x98,0xa1,0xda);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("e09d090a-12e2-569b-ad29-fb0dfb98a1da")
                IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0xe09d090a, 0x12e2, 0x569b, 0xad,0x29, 0xfb,0x0d,0xfb,0x98,0xa1,0xda)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ToastCollection IID___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IVectorView_ToastCollectionVtbl __FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IVectorView_ToastCollection __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IVectorView_ToastCollection_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IVectorView_ToastCollection_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IVectorView_ToastCollection_Release __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IVectorView_ToastCollection_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IVectorView_ToastCollection_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IVectorView_ToastCollection_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IVectorView_ToastCollection_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetAt
#define IVectorView_ToastCollection_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Size
#define IVectorView_ToastCollection_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_IndexOf
#define IVectorView_ToastCollection_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CToastNotification, 0xa819f3de, 0x60aa, 0x5159, 0x84,0x07, 0xf0,0xa7,0xfb,0x1f,0x68,0x32);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("a819f3de-60aa-5159-8407-f0a7fb1f6832")
                IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification, 0xa819f3de, 0x60aa, 0x5159, 0x84,0x07, 0xf0,0xa7,0xfb,0x1f,0x68,0x32)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CToastNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CToastNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CToastNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::ToastNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CToastNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_ToastNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CToastNotification
#define IVectorView_ToastNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CToastNotificationVtbl
#define IVectorView_ToastNotification __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification
#define IVectorView_ToastNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_QueryInterface
#define IVectorView_ToastNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_AddRef
#define IVectorView_ToastNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_Release
#define IVectorView_ToastNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetIids
#define IVectorView_ToastNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetRuntimeClassName
#define IVectorView_ToastNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetTrustLevel
#define IVectorView_ToastNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetAt
#define IVectorView_ToastNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_get_Size
#define IVectorView_ToastNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_IndexOf
#define IVectorView_ToastNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CToastNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::UI::Notifications::UserNotification* > interface
 */
#ifndef ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0x5a08f98c, 0x8e45, 0x5705, 0xaf,0x54, 0xf5,0x41,0x8e,0x59,0x83,0x92);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("5a08f98c-8e45-5705-af54-f5418e598392")
                IVectorView<ABI::Windows::UI::Notifications::UserNotification* > : IVectorView_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::UserNotification*, ABI::Windows::UI::Notifications::IUserNotification* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0x5a08f98c, 0x8e45, 0x5705, 0xaf,0x54, 0xf5,0x41,0x8e,0x59,0x83,0x92)
#endif
#else
typedef struct __FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CIUserNotification **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::UI::Notifications::UserNotification* > methods ***/
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetAt(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Size(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_IndexOf(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetMany(__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CIUserNotification **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_UserNotification IID___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IVectorView_UserNotificationVtbl __FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IVectorView_UserNotification __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IVectorView_UserNotification_QueryInterface __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IVectorView_UserNotification_AddRef __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IVectorView_UserNotification_Release __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IVectorView_UserNotification_GetIids __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids
#define IVectorView_UserNotification_GetRuntimeClassName __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName
#define IVectorView_UserNotification_GetTrustLevel __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel
#define IVectorView_UserNotification_GetAt __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetAt
#define IVectorView_UserNotification_get_Size __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Size
#define IVectorView_UserNotification_IndexOf __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_IndexOf
#define IVectorView_UserNotification_GetMany __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVector<ABI::Windows::UI::Notifications::NotificationBinding* > interface
 */
#ifndef ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__
#define ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVector_1_Windows__CUI__CNotifications__CNotificationBinding, 0x7f7d8ad7, 0xb4d2, 0x5a03, 0xbe,0x6f, 0x2b,0x89,0x87,0x5f,0xb3,0x2d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("7f7d8ad7-b4d2-5a03-be6f-2b89875fb32d")
                IVector<ABI::Windows::UI::Notifications::NotificationBinding* > : IVector_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::NotificationBinding*, ABI::Windows::UI::Notifications::INotificationBinding* > >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding, 0x7f7d8ad7, 0xb4d2, 0x5a03, 0xbe,0x6f, 0x2b,0x89,0x87,0x5f,0xb3,0x2d)
#endif
#else
typedef struct __FIVector_1_Windows__CUI__CNotifications__CNotificationBindingVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        TrustLevel *trustLevel);

    /*** IVector<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *GetView)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding **value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *SetAt)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value);

    HRESULT (STDMETHODCALLTYPE *InsertAt)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 index);

    HRESULT (STDMETHODCALLTYPE *Append)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAtEnd)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *ReplaceAll)(
        __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding *This,
        UINT32 count,
        __x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items);

    END_INTERFACE
} __FIVector_1_Windows__CUI__CNotifications__CNotificationBindingVtbl;

interface __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding {
    CONST_VTBL __FIVector_1_Windows__CUI__CNotifications__CNotificationBindingVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVector<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetView(This,value) (This)->lpVtbl->GetView(This,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_SetAt(This,index,value) (This)->lpVtbl->SetAt(This,index,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_InsertAt(This,index,value) (This)->lpVtbl->InsertAt(This,index,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Append(This,value) (This)->lpVtbl->Append(This,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAtEnd(This) (This)->lpVtbl->RemoveAtEnd(This)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Clear(This) (This)->lpVtbl->Clear(This)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#define __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_ReplaceAll(This,count,items) (This)->lpVtbl->ReplaceAll(This,count,items)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Release(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVector<ABI::Windows::UI::Notifications::NotificationBinding* > methods ***/
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetView(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,__FIVectorView_1_Windows__CUI__CNotifications__CNotificationBinding **value) {
    return This->lpVtbl->GetView(This,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_SetAt(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value) {
    return This->lpVtbl->SetAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_InsertAt(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value) {
    return This->lpVtbl->InsertAt(This,index,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAt(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 index) {
    return This->lpVtbl->RemoveAt(This,index);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Append(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding *value) {
    return This->lpVtbl->Append(This,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAtEnd(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->RemoveAtEnd(This);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Clear(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This) {
    return This->lpVtbl->Clear(This);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
static inline HRESULT __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_ReplaceAll(__FIVector_1_Windows__CUI__CNotifications__CNotificationBinding* This,UINT32 count,__x_ABI_CWindows_CUI_CNotifications_CINotificationBinding **items) {
    return This->lpVtbl->ReplaceAll(This,count,items);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVector_NotificationBinding IID___FIVector_1_Windows__CUI__CNotifications__CNotificationBinding
#define IVector_NotificationBindingVtbl __FIVector_1_Windows__CUI__CNotifications__CNotificationBindingVtbl
#define IVector_NotificationBinding __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding
#define IVector_NotificationBinding_QueryInterface __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_QueryInterface
#define IVector_NotificationBinding_AddRef __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_AddRef
#define IVector_NotificationBinding_Release __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Release
#define IVector_NotificationBinding_GetIids __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetIids
#define IVector_NotificationBinding_GetRuntimeClassName __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetRuntimeClassName
#define IVector_NotificationBinding_GetTrustLevel __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetTrustLevel
#define IVector_NotificationBinding_GetAt __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetAt
#define IVector_NotificationBinding_get_Size __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_get_Size
#define IVector_NotificationBinding_GetView __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetView
#define IVector_NotificationBinding_IndexOf __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_IndexOf
#define IVector_NotificationBinding_SetAt __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_SetAt
#define IVector_NotificationBinding_InsertAt __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_InsertAt
#define IVector_NotificationBinding_RemoveAt __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAt
#define IVector_NotificationBinding_Append __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Append
#define IVector_NotificationBinding_RemoveAtEnd __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_RemoveAtEnd
#define IVector_NotificationBinding_Clear __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_Clear
#define IVector_NotificationBinding_GetMany __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_GetMany
#define IVector_NotificationBinding_ReplaceAll __FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_ReplaceAll
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVector_1_Windows__CUI__CNotifications__CNotificationBinding_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > interface
 */
#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0x34d4fa14, 0x252b, 0x5cb4, 0xa7,0xda, 0x97,0x1e,0xe5,0xda,0xec,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("34d4fa14-252b-5cb4-a7da-971ee5daec7c")
            IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0x34d4fa14, 0x252b, 0x5cb4, 0xa7,0xda, 0x97,0x1e,0xe5,0xda,0xec,0x7c)
#endif
#else
typedef struct __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **results);

    END_INTERFACE
} __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_put_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetResults(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__FIVectorView_1_Windows__CUI__CNotifications__CToastCollection **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IVectorView_ToastCollection IID___FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperation_IVectorView_ToastCollectionVtbl __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IAsyncOperation_IVectorView_ToastCollection __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperation_IVectorView_ToastCollection_QueryInterface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IAsyncOperation_IVectorView_ToastCollection_AddRef __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IAsyncOperation_IVectorView_ToastCollection_Release __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IAsyncOperation_IVectorView_ToastCollection_GetIids __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IAsyncOperation_IVectorView_ToastCollection_GetRuntimeClassName __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IAsyncOperation_IVectorView_ToastCollection_GetTrustLevel __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IAsyncOperation_IVectorView_ToastCollection_put_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_put_Completed
#define IAsyncOperation_IVectorView_ToastCollection_get_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_get_Completed
#define IAsyncOperation_IVectorView_ToastCollection_GetResults __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > interface
 */
#ifndef ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0xbf7f3d3c, 0x230f, 0x54ea, 0xad,0x74, 0x0c,0xf6,0xc5,0x5c,0xd8,0xd1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("bf7f3d3c-230f-54ea-ad74-0cf6c55cd8d1")
            IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > : IAsyncOperation_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0xbf7f3d3c, 0x230f, 0x54ea, 0xad,0x74, 0x0c,0xf6,0xc5,0x5c,0xd8,0xd1)
#endif
#else
typedef struct __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIVectorView_1_Windows__CUI__CNotifications__CUserNotification **results);

    END_INTERFACE
} __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_put_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Completed(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetResults(__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__FIVectorView_1_Windows__CUI__CNotifications__CUserNotification **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_IVectorView_UserNotification IID___FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IAsyncOperation_IVectorView_UserNotificationVtbl __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IAsyncOperation_IVectorView_UserNotification __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IAsyncOperation_IVectorView_UserNotification_QueryInterface __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IAsyncOperation_IVectorView_UserNotification_AddRef __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IAsyncOperation_IVectorView_UserNotification_Release __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IAsyncOperation_IVectorView_UserNotification_GetIids __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetIids
#define IAsyncOperation_IVectorView_UserNotification_GetRuntimeClassName __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetRuntimeClassName
#define IAsyncOperation_IVectorView_UserNotification_GetTrustLevel __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetTrustLevel
#define IAsyncOperation_IVectorView_UserNotification_put_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_put_Completed
#define IAsyncOperation_IVectorView_UserNotification_get_Completed __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_get_Completed
#define IAsyncOperation_IVectorView_UserNotification_GetResults __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection, 0x9310ec47, 0x9f0a, 0x5999, 0x80,0xc2, 0x4b,0x31,0xe9,0xf7,0x7e,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("9310ec47-9f0a-5999-80c2-4b31e9f77e8e")
            IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection, 0x9310ec47, 0x9f0a, 0x5999, 0x80,0xc2, 0x4b,0x31,0xe9,0xf7,0x7e,0x8e)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastCollection **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetIids(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_put_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_get_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetResults(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection* This,__x_ABI_CWindows_CUI_CNotifications_CIToastCollection **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ToastCollection IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperation_ToastCollectionVtbl __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IAsyncOperation_ToastCollection __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperation_ToastCollection_QueryInterface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IAsyncOperation_ToastCollection_AddRef __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IAsyncOperation_ToastCollection_Release __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IAsyncOperation_ToastCollection_GetIids __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetIids
#define IAsyncOperation_ToastCollection_GetRuntimeClassName __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetRuntimeClassName
#define IAsyncOperation_ToastCollection_GetTrustLevel __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetTrustLevel
#define IAsyncOperation_ToastCollection_put_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_put_Completed
#define IAsyncOperation_ToastCollection_get_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_get_Completed
#define IAsyncOperation_ToastCollection_GetResults __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory, 0x2a22fecb, 0x4b96, 0x551f, 0xb7,0xb9, 0xa7,0xb5,0xbe,0xec,0xad,0x05);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("2a22fecb-4b96-551f-b7b9-a7b5beecad05")
            IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotificationHistory*, ABI::Windows::UI::Notifications::IToastNotificationHistory* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory, 0x2a22fecb, 0x4b96, 0x551f, 0xb7,0xb9, 0xa7,0xb5,0xbe,0xec,0xad,0x05)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl;

interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory {
    CONST_VTBL __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetIids(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetTrustLevel(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_put_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_get_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetResults(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationHistory **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ToastNotificationHistory IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory
#define IAsyncOperation_ToastNotificationHistoryVtbl __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl
#define IAsyncOperation_ToastNotificationHistory __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory
#define IAsyncOperation_ToastNotificationHistory_QueryInterface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface
#define IAsyncOperation_ToastNotificationHistory_AddRef __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef
#define IAsyncOperation_ToastNotificationHistory_Release __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release
#define IAsyncOperation_ToastNotificationHistory_GetIids __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetIids
#define IAsyncOperation_ToastNotificationHistory_GetRuntimeClassName __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetRuntimeClassName
#define IAsyncOperation_ToastNotificationHistory_GetTrustLevel __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetTrustLevel
#define IAsyncOperation_ToastNotificationHistory_put_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_put_Completed
#define IAsyncOperation_ToastNotificationHistory_get_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_get_Completed
#define IAsyncOperation_ToastNotificationHistory_GetResults __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier, 0x2dddc10e, 0x38e6, 0x5655, 0xad,0xf3, 0x82,0x0e,0x8f,0xb1,0x4d,0xcc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("2dddc10e-38e6-5655-adf3-820e8fb14dcc")
            IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotifier*, ABI::Windows::UI::Notifications::IToastNotifier* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier, 0x2dddc10e, 0x38e6, 0x5655, 0xad,0xf3, 0x82,0x0e,0x8f,0xb1,0x4d,0xcc)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifierVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifierVtbl;

interface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier {
    CONST_VTBL __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_AddRef(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_Release(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetIids(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetTrustLevel(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_put_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_get_Completed(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static inline HRESULT __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetResults(__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_ToastNotifier IID___FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier
#define IAsyncOperation_ToastNotifierVtbl __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifierVtbl
#define IAsyncOperation_ToastNotifier __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier
#define IAsyncOperation_ToastNotifier_QueryInterface __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface
#define IAsyncOperation_ToastNotifier_AddRef __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_AddRef
#define IAsyncOperation_ToastNotifier_Release __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_Release
#define IAsyncOperation_ToastNotifier_GetIids __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetIids
#define IAsyncOperation_ToastNotifier_GetRuntimeClassName __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetRuntimeClassName
#define IAsyncOperation_ToastNotifier_GetTrustLevel __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetTrustLevel
#define IAsyncOperation_ToastNotifier_put_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_put_Completed
#define IAsyncOperation_ToastNotifier_get_Completed __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_get_Completed
#define IAsyncOperation_ToastNotifier_GetResults __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0x4650e069, 0x3052, 0x530e, 0xbc,0x38, 0x93,0xc4,0x11,0x77,0x3b,0x77);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("4650e069-3052-530e-bc38-93c411773b77")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection, 0x4650e069, 0x3052, 0x530e, 0xbc,0x38, 0x93,0xc4,0x11,0x77,0x3b,0x77)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::ToastCollection* >* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Invoke(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IVectorView_ToastCollection IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollectionVtbl __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection_QueryInterface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection_AddRef __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection_Release __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IAsyncOperationCompletedHandler_IVectorView_ToastCollection_Invoke __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0x9e42ed08, 0x45b3, 0x5643, 0xb5,0xc7, 0xb2,0x16,0xf5,0x78,0x15,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("9e42ed08-45b3-5643-b5c7-b216f5781594")
            IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification, 0x9e42ed08, 0x45b3, 0x5643, 0xb5,0xc7, 0xb2,0x16,0xf5,0x78,0x15,0x94)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *This,
        __FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl;

interface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
#define __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::UI::Notifications::UserNotification* >* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Invoke(__FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification* This,__FIAsyncOperation_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_IVectorView_UserNotification IID___FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IAsyncOperationCompletedHandler_IVectorView_UserNotificationVtbl __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotificationVtbl
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification_QueryInterface __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_QueryInterface
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification_AddRef __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_AddRef
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification_Release __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Release
#define IAsyncOperationCompletedHandler_IVectorView_UserNotification_Invoke __FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1___FIVectorView_1_Windows__CUI__CNotifications__CUserNotification_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection, 0x8d44ca1e, 0x15d7, 0x5bcb, 0xb0,0x02, 0x38,0x4c,0x87,0x17,0x1c,0x74);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("8d44ca1e-15d7-5bcb-b002-384c87171c74")
            IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastCollection*, ABI::Windows::UI::Notifications::IToastCollection* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection, 0x8d44ca1e, 0x15d7, 0x5bcb, 0xb0,0x02, 0x38,0x4c,0x87,0x17,0x1c,0x74)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection *This,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollectionVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Release(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastCollection* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection* This,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastCollection *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ToastCollection IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperationCompletedHandler_ToastCollectionVtbl __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollectionVtbl
#define IAsyncOperationCompletedHandler_ToastCollection __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection
#define IAsyncOperationCompletedHandler_ToastCollection_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_QueryInterface
#define IAsyncOperationCompletedHandler_ToastCollection_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_AddRef
#define IAsyncOperationCompletedHandler_ToastCollection_Release __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Release
#define IAsyncOperationCompletedHandler_ToastCollection_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory, 0xc661d5da, 0x6762, 0x5d93, 0x91,0x38, 0xe7,0xda,0xcd,0x57,0x10,0x56);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("c661d5da-6762-5d93-9138-e7dacd571056")
            IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotificationHistory*, ABI::Windows::UI::Notifications::IToastNotificationHistory* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory, 0xc661d5da, 0x6762, 0x5d93, 0x91,0x38, 0xe7,0xda,0xcd,0x57,0x10,0x56)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory *This,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotificationHistory* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory* This,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotificationHistory *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ToastNotificationHistory IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory
#define IAsyncOperationCompletedHandler_ToastNotificationHistoryVtbl __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistoryVtbl
#define IAsyncOperationCompletedHandler_ToastNotificationHistory __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory
#define IAsyncOperationCompletedHandler_ToastNotificationHistory_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_QueryInterface
#define IAsyncOperationCompletedHandler_ToastNotificationHistory_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_AddRef
#define IAsyncOperationCompletedHandler_ToastNotificationHistory_Release __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Release
#define IAsyncOperationCompletedHandler_ToastNotificationHistory_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotificationHistory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier, 0xfde26ed7, 0xbc37, 0x5a7c, 0xb3,0xda, 0x3e,0x41,0xac,0x97,0xbb,0xa4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("fde26ed7-bc37-5a7c-b3da-3e41ac97bba4")
            IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotifier*, ABI::Windows::UI::Notifications::IToastNotifier* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier, 0xfde26ed7, 0xbc37, 0x5a7c, 0xb3,0xda, 0x3e,0x41,0xac,0x97,0xbb,0xa4)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifierVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier *This,
        __FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifierVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Release(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::UI::Notifications::ToastNotifier* > methods ***/
static inline HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier* This,__FIAsyncOperation_1_Windows__CUI__CNotifications__CToastNotifier *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_ToastNotifier IID___FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier
#define IAsyncOperationCompletedHandler_ToastNotifierVtbl __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifierVtbl
#define IAsyncOperationCompletedHandler_ToastNotifier __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier
#define IAsyncOperationCompletedHandler_ToastNotifier_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_QueryInterface
#define IAsyncOperationCompletedHandler_ToastNotifier_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_AddRef
#define IAsyncOperationCompletedHandler_ToastNotifier_Release __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Release
#define IAsyncOperationCompletedHandler_ToastNotifier_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CUI__CNotifications__CToastNotifier_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable, 0xab54de2d, 0x97d9, 0x5528, 0xb6,0xad, 0x10,0x5a,0xfe,0x15,0x65,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ab54de2d-97d9-5528-b6ad-105afe156530")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable, 0xab54de2d, 0x97d9, 0x5528, 0xb6,0xad, 0x10,0x5a,0xfe,0x15,0x65,0x30)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *This);

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotification_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable
#define ITypedEventHandler_ToastNotification_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectableVtbl
#define ITypedEventHandler_ToastNotification_IInspectable __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable
#define ITypedEventHandler_ToastNotification_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_QueryInterface
#define ITypedEventHandler_ToastNotification_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_AddRef
#define ITypedEventHandler_ToastNotification_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Release
#define ITypedEventHandler_ToastNotification_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs, 0x61c2402f, 0x0ed0, 0x5a18, 0xab,0x69, 0x59,0xf4,0xaa,0x99,0xa3,0x68);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("61c2402f-0ed0-5a18-ab69-59f4aa99a368")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastDismissedEventArgs*, ABI::Windows::UI::Notifications::IToastDismissedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs, 0x61c2402f, 0x0ed0, 0x5a18, 0xab,0x69, 0x59,0xf4,0xaa,0x99,0xa3,0x68)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *This);

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,
        __x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastDismissedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,__x_ABI_CWindows_CUI_CNotifications_CIToastDismissedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotification_ToastDismissedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgsVtbl
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_QueryInterface
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_AddRef
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Release
#define ITypedEventHandler_ToastNotification_ToastDismissedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastDismissedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs, 0x95e3e803, 0xc969, 0x5e3a, 0x97,0x53, 0xea,0x2a,0xd2,0x2a,0x9a,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("95e3e803-c969-5e3a-9753-ea2ad22a9a33")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotification*, ABI::Windows::UI::Notifications::IToastNotification* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastFailedEventArgs*, ABI::Windows::UI::Notifications::IToastFailedEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs, 0x95e3e803, 0xc969, 0x5e3a, 0x97,0x53, 0xea,0x2a,0xd2,0x2a,0x9a,0x33)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *This);

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,
        __x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotification*,ABI::Windows::UI::Notifications::ToastFailedEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotification *sender,__x_ABI_CWindows_CUI_CNotifications_CIToastFailedEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotification_ToastFailedEventArgs IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgsVtbl
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_QueryInterface
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_AddRef
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Release
#define ITypedEventHandler_ToastNotification_ToastFailedEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotification_Windows__CUI__CNotifications__CToastFailedEventArgs_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable, 0x821bdf6b, 0x029a, 0x5299, 0x93,0xf3, 0x30,0x77,0xb2,0xee,0x5e,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("821bdf6b-029a-5299-93f3-3077b2ee5e33")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*, ABI::Windows::UI::Notifications::IToastNotificationManagerForUser* >, IInspectable* >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable, 0x821bdf6b, 0x029a, 0x5299, 0x93,0xf3, 0x30,0x77,0xb2,0xee,0x5e,0x33)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectableVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *This);

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *sender,
        IInspectable *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectableVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotificationManagerForUser*,IInspectable* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotificationManagerForUser *sender,IInspectable *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotificationManagerForUser_IInspectable IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectableVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectableVtbl
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_QueryInterface
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_AddRef
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Release
#define ITypedEventHandler_ToastNotificationManagerForUser_IInspectable_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotificationManagerForUser_IInspectable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > interface
 */
#ifndef ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__
#define ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs, 0xb1bb0cab, 0xf8b9, 0x5909, 0xa8,0x72, 0xef,0x29,0xe0,0x5a,0x8c,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("b1bb0cab-f8b9-5909-a872-ef29e05a8c7a")
            ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > : ITypedEventHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ToastNotifier*, ABI::Windows::UI::Notifications::IToastNotifier* >, ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs*, ABI::Windows::UI::Notifications::IScheduledToastNotificationShowingEventArgs* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs, 0xb1bb0cab, 0xf8b9, 0x5909, 0xa8,0x72, 0xef,0x29,0xe0,0x5a,0x8c,0x7a)
#endif
#else
typedef struct __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *This);

    /*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs *This,
        __x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *sender,
        __x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *args);

    END_INTERFACE
} __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgsVtbl;

interface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs {
    CONST_VTBL __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > methods ***/
#define __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Invoke(This,sender,args) (This)->lpVtbl->Invoke(This,sender,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_QueryInterface(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_AddRef(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Release(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** ITypedEventHandler<ABI::Windows::UI::Notifications::ToastNotifier*,ABI::Windows::UI::Notifications::ScheduledToastNotificationShowingEventArgs* > methods ***/
static inline HRESULT __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Invoke(__FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs* This,__x_ABI_CWindows_CUI_CNotifications_CIToastNotifier *sender,__x_ABI_CWindows_CUI_CNotifications_CIScheduledToastNotificationShowingEventArgs *args) {
    return This->lpVtbl->Invoke(This,sender,args);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs IID___FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgsVtbl __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgsVtbl
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs_QueryInterface __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_QueryInterface
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs_AddRef __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_AddRef
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs_Release __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Release
#define ITypedEventHandler_ToastNotifier_ScheduledToastNotificationShowingEventArgs_Invoke __FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FITypedEventHandler_2_Windows__CUI__CNotifications__CToastNotifier_Windows__CUI__CNotifications__CScheduledToastNotificationShowingEventArgs_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_ui_notifications_h__ */
