# Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of The Linux Foundation nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED"AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

dpmservice                                     u:object_r:vendor_dpmservice:s0
MinkBinderSvc                                  u:object_r:vendor_MinkBinderSvc:s0
vendor.perfservice                             u:object_r:vendor_perf_service:s0
vendor.qdtservice                              u:object_r:vendor_qdt_service:s0
sms-sec                                        u:object_r:radio_service:s0
extphone                                       u:object_r:radio_service:s0
qti.ims.ext                                    u:object_r:radio_service:s0
qti.radio.extphone                             u:object_r:radio_service:s0
com.qualcomm.location.izat.IzatService         u:object_r:vendor_izat_service:s0
qti.security.seempspa                          u:object_r:vendor_seemp_service:s0
vendor.audio.vrservice                         u:object_r:audioserver_service:s0
com.qti.snapdragon.sdk.display.IColorService   u:object_r:vendor_color_service:s0
wigigp2p                                       u:object_r:vendor_wigigp2p_service:s0
wigig                                          u:object_r:vendor_wigig_service:s0
display.smomoservice                           u:object_r:surfaceflinger_service:s0
vendor.vpsservice                              u:object_r:vendor_vps_service:s0
wfdservice                                     u:object_r:wfdservice_service:s0
vendor.qspmsvc                                 u:object_r:vendor_qspmsvc_service:s0

