From fe877009c7d5b5f8e4a49e8bfdf8033aa444d86e Mon Sep 17 00:00:00 2001
From: chenqiyang <1406175257@qq.com>
Date: 星期三, 01 九月 2021 17:42:22 +0800
Subject: [PATCH] 纯oc linphone sdk工程

---
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m                                                                       |  303 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/listener.h                         |  193 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.h                                                                       |   42 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-auth-info.h                   |  259 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call.h                        |  844 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/core.h                              | 6052 ++++++
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/nat_policy.h                        |  194 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msasync.h                     |   73 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/account_creator_service.h           |  282 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msx264.framework/msx264                                        |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/player.h                            |  206 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/port.h                                  |  403 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideopresets.h              |  110 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/parameters.h                       |   73 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework/msopenh264                                |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/bctoolbox                                  |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/provider.h                         |  149 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msutils.h                     |   55 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msudp.h                       |   36 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/headers.h                           |   81 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/bitratecontrol.h              |  253 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphone_proxy_config.h             |   26 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/rfc3984.h                     |   80 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneUtlis.h                                                                                  |   51 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/list.h                             |   58 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/event.h                                 |  186 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata                                              |    7 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Info.plist                                      |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/security-event-enums.h        |   32 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/LinPhoneWraper.h                                                                                    |  638 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/tester.h                           |  183 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call.h                              |   27 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/qualityindicator.h            |  101 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-listener.h                    |   61 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/dictionary.h                        |   61 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room.h                   |  533 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/LinPhoneWraper.m                                                                                    |   67 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-types.h                       |  305 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/core_utils.h                        |  143 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/types.h                             | 1226 +
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/transaction.h                      |  100 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-message.h                |  472 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/charconv.h                         |   82 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-event-log.h                   |  180 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/dialog.h                           |  124 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonecore.h                      |   26 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/enum-mask.h                   |  170 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/sip-uri.h                          |  296 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msequalizer.h                 |   54 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/sipstack.h                         |  211 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/wrapper_utils.h                     |  126 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/chat.h                              |   66 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/xmlrpc.h                            |  251 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/payloadtype.h                           |  202 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/proxy_config.h                      |  694 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/b64.h                                   |  421 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Modules/swift-umbrella.h                    |   24 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/crypto.h                           | 1165 +
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mscommon.h                    |  592 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/bits_rw.h                     |   63 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mssilk.framework/mssilk                                        |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mseventqueue.h                |   74 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/sessionset.h                            |  139 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/defs.h                             |   69 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonepresence.h                  |   25 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mswebcam.h                    |  261 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_stats.h                        |   25 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/defs.h                              |   52 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/im_notif_policy.h                   |  169 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework/Info.plist                                  |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK.xcodeproj/xcshareddata/xcschemes/HDLLinPhoneSDK.xcscheme                                            |   67 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/mdns_register.h                    |   72 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/fs.h                          |   38 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/defs.h                             |   34 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-imdn-state.h      |   91 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/compiler.h                         |   49 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/belle-sip.h                        |   57 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msv4l.h                       |   30 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msx264.framework/Info.plist                                    |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/utils.h                            |  168 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework/mscodec2                                    |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/headers.h                          |  871 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belr.framework/belr                                            |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_params.h                       |  515 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msitc.h                       |   27 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dtmfgen.h                     |   74 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneLog.h                                                                                    |   37 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/bodyhandler.h                      |  109 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/listeningpoint.h                   |   90 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-search-result.h               |   82 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msrtt4103.h                   |   47 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/ringtoneplayer.h                    |   55 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-device-identity.h |   64 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/chat-message-enums.h          |   40 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpsignaltable.h                        |   53 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/parser.h                           |   94 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideoout.h                  |   28 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room-cbs.h               |  337 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/port.h                             |  691 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msaudiomixer.h                |   42 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-magic-search.h                |  149 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msogl.h                       |   25 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_log.h                          |  259 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/list.h                             |   89 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/linphone                                    |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mspcapfileplayer.h            |   55 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework/mswebrtc                                    |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/object.h                           |  546 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneLog.m                                                                                    |  138 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/lime                                            |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/resolver.h                         |  124 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/video_definition.h                  |  153 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call-stats.h                  |  211 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msextdisplay.h                |   33 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/misc.h                              |  245 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mediastream.h                 | 1347 +
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinPhoneCommon.h                                                                                 |   21 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinPhoneCommon.m                                                                                 |  155 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/logging.h                          |  346 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mscodecutils.h                |  207 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/logging.h                               |  141 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/error_info.h                        |  181 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msinterfaces.h                |  361 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/belle-sdp.h                        |  413 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-dial-plan.h                   |  126 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/call-enums.h                  |   74 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideo.h                     |  484 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/vcard_grammar                                |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/ice.h                         |  946 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-address.h                     |  286 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/message.h                          |  175 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/im_encryption_engine.h              |  231 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/flowcontrol.h                 |   62 
 Shared.IOS.HDLLinphoneSDK/Shared.IOS.HDLLinphoneSDK/ApiDefinition.cs                                                                  |    6 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/vconnect.h                         |  219 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/vfs.h                              |  235 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/encryption-engine-enums.h     |   31 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/Info.plist                                   |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework/Info.plist                                  |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/refresher.h                        |  123 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/chat-room-enums.h             |   55 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/dict.h                             |  139 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/mainloop.h                         |  205 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneManager.m                                                                                | 3373 +++
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/factory.h                           |  592 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/magic-macros.h                |  290 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework/Info.plist                                |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/payload_type.h                      |  182 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/object++.hh                        |  194 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mschanadapter.h               |   27 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneManager.h                                                                                |  250 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msamr.framework/Info.plist                                     |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphone_tunnel.h                   |   42 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/map.h                              |  112 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/cpim_grammar                                |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfilter.h                    |  756 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-device.h          |   89 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-message-cbs.h            |  144 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/utils.h                       |  157 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/vcard.h                             |  259 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/formats.h                     |   78 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/event.h                             |  286 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfileplayer.h                |   43 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Info.plist                            |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/ringback.wav                                |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpsession.h                            |  785 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist                                 |    8 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtp.h                                   |  134 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-api.h                         |   46 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dsptools.h                    |  389 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneIntercomVC.m                                                                             |  796 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/callbacks.h                         |  654 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/friend.h                            |  390 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msconference.h                |  216 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/belcard                                      |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/utils.h                                 |   98 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Headers/lime_ffi.h                              |  431 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/friendlist.h                        |  417 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvolume.h                    |   86 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/LinphoneAppDelegate.h                                                                               |   46 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/belle-sip                                  |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfilerec.h                   |   33 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneIntercomVC.h                                                                             |   27 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/wakelock.h                         |   45 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/str_utils.h                             |  175 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinPhoneSDK.h                                                                                    |   89 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Headers/lime.hpp                                |  384 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLPOnMonitorViewController.m                                                                      |  607 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Info.plist                                 |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/devices.h                     |   88 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/generic-uri.h                      |  161 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/types.h                            |  197 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/ortp.h                                  |   97 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinPhoneSDK.m                                                                                    |  149 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/event-log-enums.h             |   41 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/contactprovider.h                   |   59 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/allfilters.h                  |  178 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/info_message.h                      |   96 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msrtp.h                       |   59 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-message.h                     |   65 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/box-plot.h                    |   59 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Info.plist                                      |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLPOnMonitorViewController.h                                                                      |   29 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msgenericplc.h                |   29 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/nack.h                                  |   57 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msqrcodereader.h              |   30 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mstee.h                       |   30 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/configManager.h                                                                                     |   36 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfactory.h                   |  464 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msjava.h                      |   50 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-callbacks.h                   |  314 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/algorithm.h                   |   70 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Info.plist                                  |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/configManager.m                                                                                     |  132 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant.h                 |  104 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/rootca.pem                                  | 3432 +++
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtcp.h                                  |  583 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msmediaplayer.h               |  172 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneCallDelegate.m                                                                           |   14 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call-cbs.h                    |  212 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msqueue.h                     |  210 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/tunnel.h                            |  419 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-provider.h                    |   54 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonefriend.h                    |   25 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/ortp                                            |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/IASKSettingsStore.m                                                                                 |   68 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/traits.h                      |   57 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/mediastreamer2                        |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/zrtp.h                        |  265 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK.xcodeproj/project.pbxproj                                                                           |  445 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/general.h                     |  330 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/android_utils.h               |   46 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/auth-helper.h                      |  369 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/sipsetup.h                          |  168 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msjpegwriter.h                |   28 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/buffer.h                            |  144 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mssilk.framework/Info.plist                                    |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belr.framework/Info.plist                                      |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Info.plist                                 |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msamr.framework/msamr                                          |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneAudioHelper.m                                                                            |   52 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideoqualitycontroller.h    |   52 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msticker.h                    |  304 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/lpconfig.h                          |  462 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dtls_srtp.h                   |   95 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/conference.h                        |  156 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/identity_grammar                            |    0 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/ms_srtp.h                     |  150 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/enum-generator.h              |  122 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/presence.h                          |  829 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-content.h                     |  290 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mssndcard.h                   |  580 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/telephonyevents.h                       |  104 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/ldapprovider.h                      |   59 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/logging.h                           |  196 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonecore_utils.h                |   26 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msogl_functions.h             |  338 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpprofile.h                            |  105 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneCallDelegate.h                                                                           |   40 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mstonedetector.h              |   56 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/account_creator.h                   |  585 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/exception.hh                       |   83 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/upnp_igd.h                    |   96 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Modules/module.modulemap                    |   16 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room-params.h            |  140 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/stun.h                        |  354 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/x11_helper.h                  |   44 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/regex.h                            |   32 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvaddtx.h                    |   36 
 HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneAudioHelper.h                                                                            |   35 
 270 files changed, 59,783 insertions(+), 3 deletions(-)

diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.pbxproj" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.pbxproj"
new file mode 100644
index 0000000..7626b8e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.pbxproj"
@@ -0,0 +1,445 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 50;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		AE7718EE26BD250C00C9FD1B /* HDLLinphoneCallDelegate.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = AE9CCFA626BA3D0800FD514C /* HDLLinphoneCallDelegate.h */; };
+		AE996FBD26C22F790000F1F9 /* belr.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FAF26C22F790000F1F9 /* belr.framework */; };
+		AE996FBE26C22F790000F1F9 /* mediastreamer2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB026C22F790000F1F9 /* mediastreamer2.framework */; };
+		AE996FBF26C22F790000F1F9 /* msopenh264.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB126C22F790000F1F9 /* msopenh264.framework */; };
+		AE996FC026C22F790000F1F9 /* bctoolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB226C22F790000F1F9 /* bctoolbox.framework */; };
+		AE996FC126C22F790000F1F9 /* mswebrtc.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB326C22F790000F1F9 /* mswebrtc.framework */; };
+		AE996FC226C22F790000F1F9 /* msamr.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB426C22F790000F1F9 /* msamr.framework */; };
+		AE996FC326C22F790000F1F9 /* belle-sip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB526C22F790000F1F9 /* belle-sip.framework */; };
+		AE996FC426C22F790000F1F9 /* ortp.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB626C22F790000F1F9 /* ortp.framework */; };
+		AE996FC526C22F790000F1F9 /* mscodec2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB726C22F790000F1F9 /* mscodec2.framework */; };
+		AE996FC626C22F790000F1F9 /* mssilk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB826C22F790000F1F9 /* mssilk.framework */; };
+		AE996FC726C22F790000F1F9 /* lime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FB926C22F790000F1F9 /* lime.framework */; };
+		AE996FC826C22F7A0000F1F9 /* belcard.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FBA26C22F790000F1F9 /* belcard.framework */; };
+		AE996FC926C22F7A0000F1F9 /* msx264.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FBB26C22F790000F1F9 /* msx264.framework */; };
+		AE996FCA26C22F7A0000F1F9 /* linphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AE996FBC26C22F790000F1F9 /* linphone.framework */; };
+		AE9ABD2D26DDD7E300CB96D7 /* HDLLPOnMonitorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AE9ABD2B26DDD7E300CB96D7 /* HDLLPOnMonitorViewController.m */; };
+		AE9CC93426B8DD3F00FD514C /* HDLLinPhoneSDK.m in Sources */ = {isa = PBXBuildFile; fileRef = AE9CC93326B8DD3F00FD514C /* HDLLinPhoneSDK.m */; };
+		AE9CCFA726BA3D0800FD514C /* HDLLinphoneIntercomVC.m in Sources */ = {isa = PBXBuildFile; fileRef = AE9CCFA326BA3D0700FD514C /* HDLLinphoneIntercomVC.m */; };
+		AE9CCFA826BA3D0800FD514C /* HDLLinphoneCallDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AE9CCFA426BA3D0700FD514C /* HDLLinphoneCallDelegate.m */; };
+		AEB4A76526BBED39005641ED /* HDLLinPhoneCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB4A76426BBED39005641ED /* HDLLinPhoneCommon.m */; };
+		AEB4A76626BBF57B005641ED /* HDLLinPhoneSDK.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = AE9CC93226B8DD3F00FD514C /* HDLLinPhoneSDK.h */; };
+		AEB7CC4826C268F7005DD19A /* HDLLinphoneManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB7CC4626C268F7005DD19A /* HDLLinphoneManager.m */; };
+		AEB7CC4C26C26EB2005DD19A /* HDLLinphoneAudioHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB7CC4B26C26EB2005DD19A /* HDLLinphoneAudioHelper.m */; };
+		AEB7CC7C26C274E1005DD19A /* HDLLinphoneLog.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB7CC7B26C274E1005DD19A /* HDLLinphoneLog.m */; };
+		AEB7CC7F26C27512005DD19A /* HDLLinphoneProviderDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AEB7CC7E26C27512005DD19A /* HDLLinphoneProviderDelegate.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		AE9CC92D26B8DD3F00FD514C /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "include/$(PRODUCT_NAME)";
+			dstSubfolderSpec = 16;
+			files = (
+				AE7718EE26BD250C00C9FD1B /* HDLLinphoneCallDelegate.h in CopyFiles */,
+				AEB4A76626BBF57B005641ED /* HDLLinPhoneSDK.h in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		AE996FAF26C22F790000F1F9 /* belr.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = belr.framework; sourceTree = "<group>"; };
+		AE996FB026C22F790000F1F9 /* mediastreamer2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = mediastreamer2.framework; sourceTree = "<group>"; };
+		AE996FB126C22F790000F1F9 /* msopenh264.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = msopenh264.framework; sourceTree = "<group>"; };
+		AE996FB226C22F790000F1F9 /* bctoolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = bctoolbox.framework; sourceTree = "<group>"; };
+		AE996FB326C22F790000F1F9 /* mswebrtc.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = mswebrtc.framework; sourceTree = "<group>"; };
+		AE996FB426C22F790000F1F9 /* msamr.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = msamr.framework; sourceTree = "<group>"; };
+		AE996FB526C22F790000F1F9 /* belle-sip.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = "belle-sip.framework"; sourceTree = "<group>"; };
+		AE996FB626C22F790000F1F9 /* ortp.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ortp.framework; sourceTree = "<group>"; };
+		AE996FB726C22F790000F1F9 /* mscodec2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = mscodec2.framework; sourceTree = "<group>"; };
+		AE996FB826C22F790000F1F9 /* mssilk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = mssilk.framework; sourceTree = "<group>"; };
+		AE996FB926C22F790000F1F9 /* lime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = lime.framework; sourceTree = "<group>"; };
+		AE996FBA26C22F790000F1F9 /* belcard.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = belcard.framework; sourceTree = "<group>"; };
+		AE996FBB26C22F790000F1F9 /* msx264.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = msx264.framework; sourceTree = "<group>"; };
+		AE996FBC26C22F790000F1F9 /* linphone.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = linphone.framework; sourceTree = "<group>"; };
+		AE996FD126C24C280000F1F9 /* HDLLinphoneUtlis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLLinphoneUtlis.h; sourceTree = "<group>"; };
+		AE9ABD2B26DDD7E300CB96D7 /* HDLLPOnMonitorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HDLLPOnMonitorViewController.m; sourceTree = "<group>"; };
+		AE9ABD2C26DDD7E300CB96D7 /* HDLLPOnMonitorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLLPOnMonitorViewController.h; sourceTree = "<group>"; };
+		AE9CC92F26B8DD3F00FD514C /* libHDLLinPhoneSDK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHDLLinPhoneSDK.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		AE9CC93226B8DD3F00FD514C /* HDLLinPhoneSDK.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HDLLinPhoneSDK.h; sourceTree = "<group>"; };
+		AE9CC93326B8DD3F00FD514C /* HDLLinPhoneSDK.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HDLLinPhoneSDK.m; sourceTree = "<group>"; };
+		AE9CCFA226BA3D0700FD514C /* HDLLinphoneIntercomVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLLinphoneIntercomVC.h; sourceTree = "<group>"; };
+		AE9CCFA326BA3D0700FD514C /* HDLLinphoneIntercomVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HDLLinphoneIntercomVC.m; sourceTree = "<group>"; };
+		AE9CCFA426BA3D0700FD514C /* HDLLinphoneCallDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HDLLinphoneCallDelegate.m; sourceTree = "<group>"; };
+		AE9CCFA626BA3D0800FD514C /* HDLLinphoneCallDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLLinphoneCallDelegate.h; sourceTree = "<group>"; };
+		AEB4A76326BBED39005641ED /* HDLLinPhoneCommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HDLLinPhoneCommon.h; sourceTree = "<group>"; };
+		AEB4A76426BBED39005641ED /* HDLLinPhoneCommon.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HDLLinPhoneCommon.m; sourceTree = "<group>"; };
+		AEB7CC4626C268F7005DD19A /* HDLLinphoneManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HDLLinphoneManager.m; sourceTree = "<group>"; };
+		AEB7CC4726C268F7005DD19A /* HDLLinphoneManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLLinphoneManager.h; sourceTree = "<group>"; };
+		AEB7CC4A26C26EB2005DD19A /* HDLLinphoneAudioHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLLinphoneAudioHelper.h; sourceTree = "<group>"; };
+		AEB7CC4B26C26EB2005DD19A /* HDLLinphoneAudioHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HDLLinphoneAudioHelper.m; sourceTree = "<group>"; };
+		AEB7CC7A26C274E0005DD19A /* HDLLinphoneLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLLinphoneLog.h; sourceTree = "<group>"; };
+		AEB7CC7B26C274E1005DD19A /* HDLLinphoneLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HDLLinphoneLog.m; sourceTree = "<group>"; };
+		AEB7CC7D26C27512005DD19A /* HDLLinphoneProviderDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HDLLinphoneProviderDelegate.h; sourceTree = "<group>"; };
+		AEB7CC7E26C27512005DD19A /* HDLLinphoneProviderDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HDLLinphoneProviderDelegate.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		AE9CC92C26B8DD3F00FD514C /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				AE996FBF26C22F790000F1F9 /* msopenh264.framework in Frameworks */,
+				AE996FC626C22F790000F1F9 /* mssilk.framework in Frameworks */,
+				AE996FC526C22F790000F1F9 /* mscodec2.framework in Frameworks */,
+				AE996FC126C22F790000F1F9 /* mswebrtc.framework in Frameworks */,
+				AE996FBD26C22F790000F1F9 /* belr.framework in Frameworks */,
+				AE996FBE26C22F790000F1F9 /* mediastreamer2.framework in Frameworks */,
+				AE996FC826C22F7A0000F1F9 /* belcard.framework in Frameworks */,
+				AE996FCA26C22F7A0000F1F9 /* linphone.framework in Frameworks */,
+				AE996FC726C22F790000F1F9 /* lime.framework in Frameworks */,
+				AE996FC326C22F790000F1F9 /* belle-sip.framework in Frameworks */,
+				AE996FC026C22F790000F1F9 /* bctoolbox.framework in Frameworks */,
+				AE996FC226C22F790000F1F9 /* msamr.framework in Frameworks */,
+				AE996FC426C22F790000F1F9 /* ortp.framework in Frameworks */,
+				AE996FC926C22F7A0000F1F9 /* msx264.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		AE996FAC26C22F780000F1F9 /* linphone-sdk */ = {
+			isa = PBXGroup;
+			children = (
+				AE996FAD26C22F790000F1F9 /* apple-darwin */,
+			);
+			path = "linphone-sdk";
+			sourceTree = "<group>";
+		};
+		AE996FAD26C22F790000F1F9 /* apple-darwin */ = {
+			isa = PBXGroup;
+			children = (
+				AE996FAE26C22F790000F1F9 /* Frameworks */,
+			);
+			path = "apple-darwin";
+			sourceTree = "<group>";
+		};
+		AE996FAE26C22F790000F1F9 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				AE996FAF26C22F790000F1F9 /* belr.framework */,
+				AE996FB026C22F790000F1F9 /* mediastreamer2.framework */,
+				AE996FB126C22F790000F1F9 /* msopenh264.framework */,
+				AE996FB226C22F790000F1F9 /* bctoolbox.framework */,
+				AE996FB326C22F790000F1F9 /* mswebrtc.framework */,
+				AE996FB426C22F790000F1F9 /* msamr.framework */,
+				AE996FB526C22F790000F1F9 /* belle-sip.framework */,
+				AE996FB626C22F790000F1F9 /* ortp.framework */,
+				AE996FB726C22F790000F1F9 /* mscodec2.framework */,
+				AE996FB826C22F790000F1F9 /* mssilk.framework */,
+				AE996FB926C22F790000F1F9 /* lime.framework */,
+				AE996FBA26C22F790000F1F9 /* belcard.framework */,
+				AE996FBB26C22F790000F1F9 /* msx264.framework */,
+				AE996FBC26C22F790000F1F9 /* linphone.framework */,
+			);
+			path = Frameworks;
+			sourceTree = "<group>";
+		};
+		AE9CC92626B8DD3F00FD514C = {
+			isa = PBXGroup;
+			children = (
+				AE9CC93126B8DD3F00FD514C /* HDLLinPhoneSDK */,
+				AE9CC93026B8DD3F00FD514C /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		AE9CC93026B8DD3F00FD514C /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				AE9CC92F26B8DD3F00FD514C /* libHDLLinPhoneSDK.a */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		AE9CC93126B8DD3F00FD514C /* HDLLinPhoneSDK */ = {
+			isa = PBXGroup;
+			children = (
+				AE996FAC26C22F780000F1F9 /* linphone-sdk */,
+				AE9CC93226B8DD3F00FD514C /* HDLLinPhoneSDK.h */,
+				AE9CC93326B8DD3F00FD514C /* HDLLinPhoneSDK.m */,
+				AE996FD126C24C280000F1F9 /* HDLLinphoneUtlis.h */,
+				AE9CCFA626BA3D0800FD514C /* HDLLinphoneCallDelegate.h */,
+				AE9CCFA426BA3D0700FD514C /* HDLLinphoneCallDelegate.m */,
+				AE9CCFA226BA3D0700FD514C /* HDLLinphoneIntercomVC.h */,
+				AE9CCFA326BA3D0700FD514C /* HDLLinphoneIntercomVC.m */,
+				AE9ABD2C26DDD7E300CB96D7 /* HDLLPOnMonitorViewController.h */,
+				AE9ABD2B26DDD7E300CB96D7 /* HDLLPOnMonitorViewController.m */,
+				AEB4A76326BBED39005641ED /* HDLLinPhoneCommon.h */,
+				AEB4A76426BBED39005641ED /* HDLLinPhoneCommon.m */,
+				AEB7CC4726C268F7005DD19A /* HDLLinphoneManager.h */,
+				AEB7CC4626C268F7005DD19A /* HDLLinphoneManager.m */,
+				AEB7CC4A26C26EB2005DD19A /* HDLLinphoneAudioHelper.h */,
+				AEB7CC4B26C26EB2005DD19A /* HDLLinphoneAudioHelper.m */,
+				AEB7CC7A26C274E0005DD19A /* HDLLinphoneLog.h */,
+				AEB7CC7B26C274E1005DD19A /* HDLLinphoneLog.m */,
+				AEB7CC7D26C27512005DD19A /* HDLLinphoneProviderDelegate.h */,
+				AEB7CC7E26C27512005DD19A /* HDLLinphoneProviderDelegate.m */,
+			);
+			path = HDLLinPhoneSDK;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		AE9CC92E26B8DD3F00FD514C /* HDLLinPhoneSDK */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = AE9CC93826B8DD3F00FD514C /* Build configuration list for PBXNativeTarget "HDLLinPhoneSDK" */;
+			buildPhases = (
+				AE9CC92B26B8DD3F00FD514C /* Sources */,
+				AE9CC92C26B8DD3F00FD514C /* Frameworks */,
+				AE9CC92D26B8DD3F00FD514C /* CopyFiles */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = HDLLinPhoneSDK;
+			productName = HDLLinPhoneSDK;
+			productReference = AE9CC92F26B8DD3F00FD514C /* libHDLLinPhoneSDK.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		AE9CC92726B8DD3F00FD514C /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 1150;
+				ORGANIZATIONNAME = "闄堝惎鎵�";
+				TargetAttributes = {
+					AE9CC92E26B8DD3F00FD514C = {
+						CreatedOnToolsVersion = 11.5;
+					};
+				};
+			};
+			buildConfigurationList = AE9CC92A26B8DD3F00FD514C /* Build configuration list for PBXProject "HDLLinPhoneSDK" */;
+			compatibilityVersion = "Xcode 9.3";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = AE9CC92626B8DD3F00FD514C;
+			productRefGroup = AE9CC93026B8DD3F00FD514C /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				AE9CC92E26B8DD3F00FD514C /* HDLLinPhoneSDK */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+		AE9CC92B26B8DD3F00FD514C /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				AEB7CC7C26C274E1005DD19A /* HDLLinphoneLog.m in Sources */,
+				AE9ABD2D26DDD7E300CB96D7 /* HDLLPOnMonitorViewController.m in Sources */,
+				AE9CCFA826BA3D0800FD514C /* HDLLinphoneCallDelegate.m in Sources */,
+				AEB7CC4826C268F7005DD19A /* HDLLinphoneManager.m in Sources */,
+				AEB7CC7F26C27512005DD19A /* HDLLinphoneProviderDelegate.m in Sources */,
+				AEB7CC4C26C26EB2005DD19A /* HDLLinphoneAudioHelper.m in Sources */,
+				AE9CC93426B8DD3F00FD514C /* HDLLinPhoneSDK.m in Sources */,
+				AE9CCFA726BA3D0800FD514C /* HDLLinphoneIntercomVC.m in Sources */,
+				AEB4A76526BBED39005641ED /* HDLLinPhoneCommon.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		AE9CC93626B8DD3F00FD514C /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		AE9CC93726B8DD3F00FD514C /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 10.0;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		AE9CC93926B8DD3F00FD514C /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = V39C74NPHU;
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/HDLLinPhoneSDK/apple-darwin/Frameworks",
+					"$(PROJECT_DIR)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks",
+				);
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				ONLY_ACTIVE_ARCH = NO;
+				OTHER_LDFLAGS = "-ObjC";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SKIP_INSTALL = YES;
+				SWIFT_OBJC_BRIDGING_HEADER = "";
+				SWIFT_VERSION = "";
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		AE9CC93A26B8DD3F00FD514C /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = V39C74NPHU;
+				ENABLE_BITCODE = NO;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"$(PROJECT_DIR)/HDLLinPhoneSDK/apple-darwin/Frameworks",
+					"$(PROJECT_DIR)/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks",
+				);
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				ONLY_ACTIVE_ARCH = NO;
+				OTHER_LDFLAGS = "-ObjC";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SKIP_INSTALL = YES;
+				SWIFT_OBJC_BRIDGING_HEADER = "";
+				SWIFT_VERSION = "";
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		AE9CC92A26B8DD3F00FD514C /* Build configuration list for PBXProject "HDLLinPhoneSDK" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				AE9CC93626B8DD3F00FD514C /* Debug */,
+				AE9CC93726B8DD3F00FD514C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		AE9CC93826B8DD3F00FD514C /* Build configuration list for PBXNativeTarget "HDLLinPhoneSDK" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				AE9CC93926B8DD3F00FD514C /* Debug */,
+				AE9CC93A26B8DD3F00FD514C /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = AE9CC92726B8DD3F00FD514C /* Project object */;
+}
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata"
new file mode 100644
index 0000000..ff9e915
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.xcworkspace/contents.xcworkspacedata"
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:HDLLinPhoneSDK.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist"
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist"
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/xcshareddata/xcschemes/HDLLinPhoneSDK.xcscheme" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/xcshareddata/xcschemes/HDLLinPhoneSDK.xcscheme"
new file mode 100644
index 0000000..a196c2f
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK.xcodeproj/xcshareddata/xcschemes/HDLLinPhoneSDK.xcscheme"
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1250"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "AE9CC92E26B8DD3F00FD514C"
+               BuildableName = "libHDLLinPhoneSDK.a"
+               BlueprintName = "HDLLinPhoneSDK"
+               ReferencedContainer = "container:HDLLinPhoneSDK.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES">
+      <Testables>
+      </Testables>
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "AE9CC92E26B8DD3F00FD514C"
+            BuildableName = "libHDLLinPhoneSDK.a"
+            BlueprintName = "HDLLinPhoneSDK"
+            ReferencedContainer = "container:HDLLinPhoneSDK.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLPOnMonitorViewController.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLPOnMonitorViewController.h"
new file mode 100644
index 0000000..f36cb05
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLPOnMonitorViewController.h"
@@ -0,0 +1,29 @@
+//
+//  LCOnMonitorViewController.h
+//  LCOnDemo
+//
+//  Created by 闄堝槈涔� on 2021/4/26.
+//
+
+#import <UIKit/UIKit.h>
+#import "HDLLinphoneCallDelegate.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HDLLPOnMonitorViewController : UIViewController
+
+#pragma mark
+/**
+ 浜嬩欢浠g悊
+ */
+@property (nonatomic, weak) id<HDLLinphoneCallDelegate> hdlLinphoneCallDelegate;
+@property (strong, nonatomic) NSString *userName;//鍛煎彨璐﹀彿
+@property (strong, nonatomic) NSString *titleName;//鏍囬
+
+-(void)showUIAlertViewWithBack:(NSString *)mes;
+
+
+#pragma mark 瀵瑰鎺ュ彛鏂规硶
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLPOnMonitorViewController.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLPOnMonitorViewController.m"
new file mode 100644
index 0000000..0be0912
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLPOnMonitorViewController.m"
@@ -0,0 +1,607 @@
+//
+//  LCOnMonitorViewController.m
+//  LCOnDemo
+//
+//  Created by 闄堝槈涔� on 2021/4/26.
+//
+
+#import "HDLLPOnMonitorViewController.h"
+#import <AVFoundation/AVFoundation.h>
+#import <Photos/Photos.h>
+#import "HDLLinphoneUtlis.h"
+#import "HDLLinphoneManager.h"
+
+//#import "HDLLinPhoneSDK-Swift.h"
+//#import "LCUtlis.h"
+//#import "LCApiKit.h"
+//#import <LCOpenSDKDynamic/LCOpenSDKDynamic.h>
+
+@interface HDLLPOnMonitorViewController ()
+
+@property (nonatomic,assign) BOOL                  playing;
+@property (nonatomic,assign) BOOL                  isInterrupt;
+@property (nonatomic,assign) BOOL                  isSpeaking;
+@property (nonatomic,strong) UIImage               *snapImage; //鎴浘
+
+
+@property (nonatomic, strong) UIButton *backButton;  //
+@property (nonatomic, strong) UILabel *titleUILabel;  //
+@property (nonatomic, strong) UIView *centerView;  //鍐呭鑳屾櫙View
+@property (nonatomic, strong) UIView *videoView;
+
+@property (nonatomic, strong) UIButton *screenshotImgBtn;  //
+@property (nonatomic, strong) UIButton *screenshotTextBtn;  //
+
+@property (nonatomic, strong) UIButton *unlockImgBtn;  //
+@property (nonatomic, strong) UIButton *unlockTextBtn;  //
+@property (nonatomic,strong) dispatch_source_t openDoorTimer;
+@property (nonatomic, assign) int openDoorTimeout;
+
+
+/// 鎾斁鍣�
+//@property (nonatomic, strong) LCOpenSDK_PlayWindow *playWindow;
+
+@end
+
+@implementation HDLLPOnMonitorViewController
+{
+    BOOL isBackGround;
+    
+    NSString * tipStr;
+    NSString * okStr;
+    NSString * saveToTheAlbumsStr;
+    NSString * operationFailedStr;
+    NSString * screenshotStr;
+    NSString * unlockStr;
+    NSString * endOfMonitoringStr;
+    NSString * unlockSuccessfullyStr;
+    
+    NSString * LCSdkToken;
+    NSString * LCHostApi;
+    
+    CGFloat Height66;
+    bool isShowErrorAlert;
+    //    int _openDoorTimeout;
+}
+
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.view.backgroundColor = UIColor.whiteColor;
+    Height66 = GetRealWidth(66);
+    [self initLlanguage];
+    [self initTopBarView];
+    [self initCentetView];
+    [self initData];
+    [self initESVideo];
+    [self StartMonitoring];
+//    [HDLLinphoneManager.instance enableMicro:false];
+    
+//    //鏆傛椂涓嶆敮鎸佸紑閿佸姛鑳�
+//    [self setUnlock:NO];
+    //娉ㄥ唽寮�閿佹垚鍔熺洃鍚�
+    [self addOpenSuccessAction];
+    // Do any additional setup after loading the view.
+    
+    if (self.titleName&&self.titleName.length!=0) {
+        self.titleUILabel.text=self.titleName;
+    }
+    
+//    [NSNotificationCenter.defaultCenter addObserver:self
+//                                           selector:@selector(registrationUpdate:)
+//                                               name:@"LinphoneRegistrationUpdate"
+//                                             object:nil];
+    [NSNotificationCenter.defaultCenter addObserver:self
+                                           selector:@selector(linphoneCallUpdate:)
+                                               name:@"LinphoneCallUpdate"
+                                             object:nil];
+}
+
+- (void)linphoneCallUpdate:(NSNotification *)notif {
+    int state = [[notif.userInfo objectForKey:@"state"] intValue];
+    if ((state == LinphoneCallEnd || state == LinphoneCallError)){//鎸傛柇浜�
+        NSLog(@"鎸傛柇鎴栧嚭閿欎簡");
+        [self showUIAlertViewWithBack:@"鐩戣缁撴潫"];
+        
+    }
+}
+
+-(void)initLlanguage{
+    NSString *languageName = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0];
+    
+    // 绠�浣撲腑鏂�
+    if ([languageName rangeOfString:@"zh-Hans"].location != NSNotFound) {
+        tipStr = @"鎻愮ず";
+        okStr = @"纭";
+        saveToTheAlbumsStr = @"宸蹭繚瀛樿嚦鎵嬫満鐩稿唽.";
+        operationFailedStr = @"鎿嶄綔澶辫触";
+        screenshotStr = @"鎴浘";
+        unlockStr = @"寮�閿�";
+        endOfMonitoringStr = @"鐩戣缁撴潫";
+        unlockSuccessfullyStr = @"寮�閿佹垚鍔�";
+        
+    }else{
+        tipStr = @"Prompt";
+        okStr = @"OK";
+        saveToTheAlbumsStr = @"Saved to the albums.";
+        operationFailedStr = @"Operation failed.";
+        screenshotStr = @"Screenshot";
+        unlockStr = @"Unlock";
+        endOfMonitoringStr = @"End of monitoring";
+        unlockSuccessfullyStr = @"Unlock successfully";
+    }
+    
+    
+}
+
+
+//椤堕儴View
+- (void)initTopBarView {
+    UIView *TopView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, APP_TOP_BAR_HEIGHT)];
+    TopView.backgroundColor = HEXCOLORA(0xF7F7F7,1.0);
+    [TopView addSubview:self.backButton];
+    [TopView addSubview:self.titleUILabel];
+    //    [TopView addSubview:self.moreButton];
+    [self.view addSubview:TopView];
+    TopView.layer.shadowColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.25].CGColor;
+    TopView.layer.shadowOffset = CGSizeMake(0,0.5);
+    TopView.layer.shadowOpacity = 1;
+    TopView.layer.shadowRadius = 0;
+    
+}
+
+- (UIButton *)backButton{
+    if (_backButton == nil) {
+        _backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, APP_STATUS_BAR_HEIGHT, 44, 44)];
+        [_backButton setImage:[UIImage imageNamed:@"ic_esvideo_on_back"] forState:UIControlStateNormal];
+        _backButton.imageEdgeInsets = UIEdgeInsetsMake(12,12,12,12);
+        [_backButton.imageView setContentMode:UIViewContentModeScaleAspectFit];
+        [_backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
+    }
+    return _backButton;
+}
+
+-(void)backAction{
+     [self dismissViewControllerAnimated:YES completion:NULL];
+}
+
+-(UILabel *)titleUILabel{
+    if (_titleUILabel == Nil) {
+        _titleUILabel = [[UILabel alloc] initWithFrame:CGRectMake(90, APP_STATUS_BAR_HEIGHT, self.view.frame.size.width - 180, 44)];
+        _titleUILabel.font = [UIFont fontWithName:APP_UIFont_BOLD size:18.0];
+        _titleUILabel.textColor = TextColor;
+        _titleUILabel.text = @"";
+        _titleUILabel.textAlignment = NSTextAlignmentCenter;
+    }
+    return _titleUILabel;
+}
+
+- (void)initCentetView {
+    [self.view addSubview:self.centerView];
+    //    [self.centerView addSubview:self.collectButton];
+    //    [self.centerView addSubview:self.homeView];
+    [self.centerView addSubview:self.videoView];
+    [self.centerView addSubview:self.screenshotImgBtn];
+    [self.centerView addSubview:self.screenshotTextBtn];
+    [self.centerView addSubview:self.unlockImgBtn];
+    [self.centerView addSubview:self.unlockTextBtn];
+    
+}
+
+- (UIView *)centerView{
+    if (_centerView == nil) {
+        _centerView = [[UIButton alloc] initWithFrame:CGRectMake(0, APP_TOP_BAR_HEIGHT, APP_SCREEN_WIDTH, APP_VISIBLE_HEIGHT)];
+        _centerView.backgroundColor = UIColor.whiteColor;
+        //        [self setRadiusWithView:_centerView];
+        
+    }
+    return _centerView;
+}
+
+-(void)setRadiusWithView:(UIView *)mView{
+    //椤堕儴鍦嗚
+    UIRectCorner corners = UIRectCornerTopLeft | UIRectCornerTopRight;
+    if (@available(iOS 11.0, *)) {
+        mView.layer.cornerRadius = 20;
+        mView.layer.maskedCorners =  (CACornerMask)corners;
+    }else{
+        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:mView.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(20,20)];
+        //鍒涘缓 layer
+        CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
+        maskLayer.frame = mView.bounds;
+        //璧嬪��
+        maskLayer.path = maskPath.CGPath;
+        mView.layer.mask = maskLayer;
+    }
+}
+
+-(UIView *)videoView{
+    if (_videoView == Nil) {
+        _videoView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, GetRealWidth((210)))];
+        _videoView.backgroundColor = UIColor.lightGrayColor;
+        _videoView.layer.shadowColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.25].CGColor;
+        _videoView.layer.shadowOffset = CGSizeMake(0,0.5);
+        _videoView.layer.shadowOpacity = 1;
+        _videoView.layer.shadowRadius = 0;
+    }
+    return _videoView;
+}
+
+#pragma 鎴浘鍥炬爣鎸夐挳
+- (UIButton *)screenshotImgBtn{
+    if (_screenshotImgBtn == nil) {
+        _screenshotImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, Height66, Height66)];
+        [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_unselect"] forState:UIControlStateNormal];
+        //        [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_select"] forState:UIControlStateSelected];
+        [_screenshotImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
+        [_screenshotImgBtn addTarget:self action:@selector(screenshotAction) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
+        [_screenshotImgBtn addTarget:self action:@selector(screenshotDownAction) forControlEvents:UIControlEventTouchDown];
+        _screenshotImgBtn.adjustsImageWhenHighlighted = NO;
+        _screenshotImgBtn.center = CGPointMake(APP_SCREEN_WIDTH/4, GetRealWidth(276) + Height66/2);
+        
+    }
+    return _screenshotImgBtn;
+}
+
+-(void)screenshotDownAction{
+    
+    [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_select"] forState:UIControlStateNormal];
+    [_screenshotTextBtn setTitleColor:TextSelectColor forState:UIControlStateNormal];
+}
+
+
+-(void)screenshotAction{
+    [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_unselect"] forState:UIControlStateNormal];
+    [_screenshotTextBtn setTitleColor:TextColor forState:UIControlStateNormal];
+    NSLog(@"鎴浘");
+    //鎴浘
+//    if(self.playWindow){
+//        [self saveThumbImage];
+//    }
+    [HDLLinphoneManager.instance snapShotWithView:self.videoView];
+    
+}
+
+#pragma 鎴浘鏂囧瓧鎸夐挳
+- (UIButton *)screenshotTextBtn{
+    if (_screenshotTextBtn == nil) {
+        _screenshotTextBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(100), GetRealWidth(20))];
+        [_screenshotTextBtn setTitle:@"鎴浘" forState:UIControlStateNormal];
+        _screenshotTextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
+        _screenshotTextBtn.titleLabel.font = [UIFont fontWithName:APP_UIFont size:14.0];
+        [_screenshotTextBtn setTitleColor:TextColor forState:UIControlStateNormal];
+        //        [_screenshotTextBtn setTitleColor:TextSelectColor forState:UIControlStateSelected];
+        [_screenshotTextBtn addTarget:self action:@selector(screenshotAction) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
+        [_screenshotTextBtn addTarget:self action:@selector(screenshotDownAction) forControlEvents:UIControlEventTouchDown];
+        _screenshotTextBtn.adjustsImageWhenHighlighted = NO;
+        _screenshotTextBtn.center = CGPointMake(_screenshotImgBtn.center.x, GetRealWidth(364));
+    }
+    return _screenshotTextBtn;
+}
+
+- (UIButton *)unlockImgBtn{
+    if (_unlockImgBtn == nil) {
+        _unlockImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, Height66, Height66)];
+        [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_unselect"] forState:UIControlStateNormal];
+        //        [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_select"] forState:UIControlStateSelected];
+        [_unlockImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
+        [_unlockImgBtn addTarget:self action:@selector(unlockAction) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
+        [_unlockImgBtn addTarget:self action:@selector(unlockDownAction) forControlEvents:UIControlEventTouchDown];
+        _unlockImgBtn.adjustsImageWhenHighlighted = NO;
+        _unlockImgBtn.center = CGPointMake((APP_SCREEN_WIDTH / 4) * 3, GetRealWidth(276) + Height66/2);
+    }
+    return _unlockImgBtn;
+}
+
+-(void)unlockDownAction{
+    [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_select"] forState:UIControlStateNormal];
+    [_unlockTextBtn setTitleColor:TextSelectColor forState:UIControlStateNormal];
+}
+
+-(void)unlockAction{
+    [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_unselect"] forState:UIControlStateNormal];
+    [_unlockTextBtn setTitleColor:TextColor forState:UIControlStateNormal];
+    //寮�閿�
+    if(self.hdlLinphoneCallDelegate != NULL){
+        [self.hdlLinphoneCallDelegate onUnlockAction];
+    }
+    
+}
+
+- (UIButton *)unlockTextBtn{
+    if (_unlockTextBtn == nil) {
+        _unlockTextBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(100), GetRealWidth(20))];
+        [_unlockTextBtn setTitle:@"寮�閿�" forState:UIControlStateNormal];
+        _unlockTextBtn.titleLabel.font = [UIFont fontWithName:APP_UIFont size:14.0];
+        _unlockTextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
+        //        _unlockTextBtn.titleLabel.textColor = TextColor;
+        [_unlockTextBtn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
+        [_unlockTextBtn setTitleColor:TextColor forState:UIControlStateNormal];
+        //        [_unlockTextBtn setTitleColor:TextSelectColor forState:UIControlStateSelected];
+        [_unlockTextBtn addTarget:self action:@selector(unlockAction) forControlEvents:UIControlEventTouchUpInside];
+        [_unlockTextBtn addTarget:self action:@selector(unlockDownAction) forControlEvents:UIControlEventTouchDown];
+        _unlockTextBtn.adjustsImageWhenHighlighted = NO;
+        _unlockTextBtn.center = CGPointMake(_unlockImgBtn.center.x, GetRealWidth(364));
+    }
+    return _unlockTextBtn;
+}
+
+#pragma 寮�閿佹垚鍔�
+-(void)setOpenDoorSuccess{
+    [self setUnlock:NO];
+    _openDoorTimeout = 0;
+    [self startOpenDoorCountdown];
+    [self showUIAlertView:unlockSuccessfullyStr];
+    //    // 寮�閿佹垚鍔熷洖璋�
+    //    if(self.mESCallDelegate != NULL){
+    //        [self.mESCallDelegate onUnlockAction];
+    //    }
+}
+
+-(void)setUnlock:(BOOL)ISEnable{
+    [_unlockImgBtn setEnabled:ISEnable];
+    [_unlockTextBtn setEnabled:ISEnable];
+}
+
+/** 寮�鍚�掕鏃� */
+- (void)startOpenDoorCountdown {
+    
+    if (_openDoorTimeout > 10) {
+        return;
+    }
+    
+    _openDoorTimeout = 0;
+    
+    // GCD瀹氭椂鍣�
+    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
+    
+    _openDoorTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
+    
+    dispatch_source_set_timer(_openDoorTimer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0); //姣忕鎵ц
+    
+    dispatch_source_set_event_handler(_openDoorTimer, ^{
+        WEAKSELF_AT
+        if(weakSelf_AT.openDoorTimeout >= 10 ){// 璁℃椂缁撴潫
+            // 鍏抽棴瀹氭椂鍣�
+            dispatch_source_cancel(weakSelf_AT.openDoorTimer);
+            
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [weakSelf_AT setUnlock:YES];
+                
+            });
+            
+        }else{// 璁℃椂涓�
+            weakSelf_AT.openDoorTimeout++;
+            
+        }
+    });
+    
+    // 寮�鍚畾鏃跺櫒
+    dispatch_resume(_openDoorTimer);
+    
+}
+
+
+
+#pragma SDK鍙瀵硅 鍔熻兘閮ㄥ垎
+
+-(void)initESVideo{
+    
+    linphone_core_set_native_video_window_id([HDLLinphoneManager getLc], (__bridge void *)(self.videoView));
+//    [self.centerView addSubview:[self.playWindow getWindowView]];
+}
+
+-(void)initData{
+    
+    [_screenshotTextBtn setTitle:screenshotStr forState:UIControlStateNormal];
+    [_unlockTextBtn setTitle:unlockStr forState:UIControlStateNormal];
+    
+//    _titleUILabel.text = [[LCApiKit sharedInstance] currentDeviceName];
+    //    [_collectButton setSelected:_isCollect];
+}
+
+/**
+ 鏆傚仠鎾斁
+ */
+- (void)stopPlay {
+    [HDLLinphoneManager.instance endCall];
+   
+}
+
+- (void)startPlay {
+    
+//    [HDLLinphoneManager.instance fetchVideo];
+    
+}
+
+
+
+
+
+/**
+ 寮�濮嬬洃鎺�
+ */
+-(void)StartMonitoring{
+    NSLog(@"寮�濮嬪懠鍙細@%@",self.userName);
+    [HDLLinphoneManager.instance startCall:self.userName];
+    
+}
+
+-(NSString *)getCurrentdateInterval
+{
+    NSDate *datenow = [NSDate date];
+    NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)([datenow timeIntervalSince1970]*1000)];
+    return timeSp;
+}
+
+-(void)showUIAlertView:(NSString *)mes
+{
+    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:tipStr message:mes preferredStyle:UIAlertControllerStyleAlert];
+    [alertController addAction:[UIAlertAction actionWithTitle:okStr style:UIAlertActionStyleCancel handler:nil]];
+    [self presentViewController:alertController animated:YES completion:nil];
+    
+}
+
+///
+-(void)showUIAlertViewWithBack:(NSString *)mes
+{
+    isShowErrorAlert = true;
+    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:tipStr message:mes preferredStyle:UIAlertControllerStyleAlert];
+    [alertController addAction:[UIAlertAction actionWithTitle:okStr style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+        [self backAction];
+    }]];
+    
+    [self presentViewController:alertController animated:YES completion:nil];
+}
+
+
+
+#pragma viewDidAppear
+-(void)viewDidAppear:(BOOL)animated{
+
+}
+
+//-(void)setIsInterrupt:(BOOL)isInterrupt{
+//    //    if (_es) {
+//    //        _es.isInterrupt = isInterrupt;
+//    //    }
+//}
+
+- (void)viewWillAppear:(BOOL)animated {
+    [super viewWillAppear:animated];
+    
+    
+}
+-(void)viewWillDisappear:(BOOL)animated{
+    [super viewWillDisappear:animated];
+    
+    //1.鏆傚仠SDK鐩稿叧鎾斁
+    [self stopPlay];
+    //2.Delegate閲婃斁
+//    self.mLCCallDelegate = nil;
+    //3.瀹氭椂鍣ㄩ噴鏀�
+    if(_openDoorTimer){
+        dispatch_source_cancel(_openDoorTimer);
+        _openDoorTimer = nil; // OK
+    }
+    
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+-(void)dealloc{
+    NSLog(@"==============dealloc  1");
+}
+
+
+
+
+
+
+/*
+ 闇�瑕佹敞鎰忕殑鏄紝鏈変竴涓腑鏂紑濮嬫秷鎭笉涓�瀹氫細鏈変竴涓腑鏂粨鏉熸秷鎭紝杩欏氨鎰忓懗鐫�涓柇缁撴潫鐨勫洖璋冮噷鐨勫鐞嗛�昏緫鍙兘浼氭病鏈夎鎵ц鍒般��
+ 鎵�浠ラ渶瑕佸叧娉ㄥ綋鍒囧埌鍓嶅彴杩愯鐘舵�佹椂锛屾槸涓嶆槸闇�瑕侀噸鏂版縺娲讳綘鐨� Audio Session銆�
+ */
+- (void)willEnterForeground:(NSNotification*)notification{
+    NSLog(@"willEnterForeground");
+
+}
+- (void)willEnterBackground:(NSNotification *)notification {
+    isBackGround = YES;
+}
+
+
+
+
+#pragma 淇濆瓨鍥剧墖鍒扮浉鍐�
+- (void)saveImageToPhotosAlbum:(UIImage *)savedImage
+{
+    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
+    if (status == PHAuthorizationStatusNotDetermined)
+    {
+        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
+            if(status == PHAuthorizationStatusAuthorized)
+            {
+                UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
+            }
+        }];
+    }
+    else
+    {
+        if (status == PHAuthorizationStatusAuthorized)
+        {
+            UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
+        }
+    }
+}
+
+// 鎸囧畾鍥炶皟鏂规硶
+- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
+{
+    NSString *message = nil;
+    if (!error) {
+        message = saveToTheAlbumsStr;
+    }
+    else
+    {
+        message = operationFailedStr;
+    }
+    
+    [self showUIAlertView:message];
+}
+
+/**
+ 
+ */
+- (void)saveThumbImage {
+    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
+                                                         NSUserDomainMask, YES);
+    NSString *libraryDirectory = [paths objectAtIndex:0];
+    
+    NSString *myDirectory =
+    [libraryDirectory stringByAppendingPathComponent:@"ON+"];
+    NSString *picDirectory =
+    [myDirectory stringByAppendingPathComponent:@"picture"];
+    
+    NSDateFormatter *dataFormat = [[NSDateFormatter alloc] init];
+    [dataFormat setDateFormat:@"yyyyMMddHHmmss"];
+    NSString *strDate = [dataFormat stringFromDate:[NSDate date]];
+    NSString *datePath = [picDirectory stringByAppendingPathComponent:strDate];
+    NSString *picPath = [datePath stringByAppendingString:@".jpg"];
+    NSLog(@"test jpg name[%@]\n", picPath);
+    
+    NSFileManager *fileManage = [NSFileManager defaultManager];
+    NSError *pErr;
+    BOOL isDir;
+    if (NO == [fileManage fileExistsAtPath:myDirectory isDirectory:&isDir]) {
+        [fileManage createDirectoryAtPath:myDirectory
+              withIntermediateDirectories:YES
+                               attributes:nil
+                                    error:&pErr];
+    }
+    if (NO == [fileManage fileExistsAtPath:picDirectory isDirectory:&isDir]) {
+        [fileManage createDirectoryAtPath:picDirectory
+              withIntermediateDirectories:YES
+                               attributes:nil
+                                    error:&pErr];
+    }
+//    [self.playWindow snapShot:picPath];
+    UIImage *image = [UIImage imageWithContentsOfFile:picPath];
+    [self saveImageToPhotosAlbum:image];
+    
+}
+
+- (void)addOpenSuccessAction {
+
+    [[NSNotificationCenter defaultCenter] removeObserver:self
+                                                    name:HDLLPCallDelegateOpenDoorSuccess
+                                                  object:nil];
+
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(setOpenDoorSuccess)
+                                                 name:HDLLPCallDelegateOpenDoorSuccess
+                                               object:nil];
+}
+
+
+@end
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneCommon.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneCommon.h"
new file mode 100644
index 0000000..7c54af7
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneCommon.h"
@@ -0,0 +1,21 @@
+//
+//  HDLLinPhoneUtils.h
+//  HDLLinPhoneSDK
+//
+//  Created by 闄堝惎鎵� on 2021/8/5.
+//  Copyright 漏 2021 闄堝惎鎵�. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HDLLinPhoneCommon : NSObject
++(UIViewController *) topMostController;//鑾峰彇椤跺眰瑙嗗浘
++(UIWindow*)appWindow;
++(NSString *)temporarySaveImagePath;//涓存椂淇濆瓨鍥剧墖鐨勮矾鍔�
++(void)saveImageToPhotosAlbum:(UIImage *)savedImage;//淇濆瓨鍥剧墖鍒扮浉鍐�
++(UIImage *)captureImageFromView:(UIView *)view;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneCommon.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneCommon.m"
new file mode 100644
index 0000000..d643489
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneCommon.m"
@@ -0,0 +1,155 @@
+//
+//  HDLLinPhoneUtils.m
+//  HDLLinPhoneSDK
+//
+//  Created by 闄堝惎鎵� on 2021/8/5.
+//  Copyright 漏 2021 闄堝惎鎵�. All rights reserved.
+//
+
+#import "HDLLinPhoneCommon.h"
+#import <Photos/Photos.h>
+@implementation HDLLinPhoneCommon
++(UIViewController *) topMostController {
+    UIViewController*topController ;
+    if ([UIApplication sharedApplication].delegate.window) {
+        topController= [UIApplication sharedApplication].delegate.window.rootViewController;
+    }else{
+        topController=[self appWindow].rootViewController;
+    }
+    while(topController.presentedViewController){
+        topController=topController.presentedViewController;
+    }
+    return topController;
+}
+
++(UIWindow*)appWindow{
+    UIWindow *window;
+    if (@available(iOS 13.0, *)) {
+        window = [UIApplication sharedApplication].windows[0];
+        if (!window) {
+            window=[UIApplication sharedApplication].delegate.window;
+//            DT(@"13delegateWindow:%@",window);
+        }
+//        DT(@"window:%@",window);
+    } else {
+        window = [UIApplication sharedApplication].delegate.window;
+//        DT(@"delegateWindow:%@",window);
+    }
+    return window;
+}
+
++(NSString *)temporarySaveImagePath{
+    NSString *str;
+    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
+                                                         NSUserDomainMask, YES);
+    NSLog(@"path:%@",path);
+    NSString *pictureName = @"snapShot.jpg";
+    str=[NSString stringWithFormat:@"%@/%@",path[0],pictureName];
+    return str;
+}
+
+#pragma 淇濆瓨鍥剧墖鍒扮浉鍐�
++(void)saveImageToPhotosAlbum:(UIImage *)savedImage
+{
+    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
+    if (status == PHAuthorizationStatusNotDetermined)
+    {
+        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
+            if(status == PHAuthorizationStatusAuthorized)
+            {
+                UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
+            }
+        }];
+    }
+    else
+    {
+        if (status == PHAuthorizationStatusAuthorized)
+        {
+            UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
+        }
+    }
+}
+
+// 淇濆瓨鍒扮浉鍐屾寚瀹氬洖璋冩柟娉�
++(void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
+{
+    NSString *message = nil;
+    NSString *languageName = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0];
+    NSString *saveToTheAlbumsStr,*operationFailedStr,*tipStr,*okStr;
+    // 绠�浣撲腑鏂�
+    if ([languageName rangeOfString:@"zh-Hans"].location != NSNotFound) {
+        tipStr = @"鎻愮ず";
+        saveToTheAlbumsStr = @"宸蹭繚瀛樿嚦鎵嬫満鐩稿唽.";
+        operationFailedStr = @"鎿嶄綔澶辫触";
+        okStr = @"纭";
+        
+    }else{
+        tipStr = @"Prompt";
+        okStr = @"OK";
+        saveToTheAlbumsStr = @"Saved to the albums.";
+        operationFailedStr = @"Operation failed.";
+
+    }
+    if (!error) {
+        message = saveToTheAlbumsStr;
+    }
+    else
+    {
+        message = operationFailedStr;
+    }
+    
+    [self showUIAlertView:message title:tipStr cancelTitle:okStr];
+}
+
++(void)showUIAlertView:(NSString *)mes title:(NSString *)title cancelTitle:(NSString *)cancleTitle
+{
+    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:mes preferredStyle:UIAlertControllerStyleAlert];
+    [alertController addAction:[UIAlertAction actionWithTitle:cancleTitle style:UIAlertActionStyleCancel handler:nil]];
+    [[self topMostController] presentViewController:alertController animated:YES completion:nil];
+    
+}
+
+//+(UIImage *)captureImageFromView:(UIView *)view
+//{
+//    CGRect screenRect = [view bounds];
+//    UIGraphicsBeginImageContext(screenRect.size);
+//    CGContextRef ctx = UIGraphicsGetCurrentContext();
+//    [view.layer renderInContext:ctx];
+//    UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
+//    UIGraphicsEndImageContext();
+//    return image;
+//}
+
++(UIImage *)captureImageFromView:(UIView *)view{
+
+//    // currentView 褰撳墠鐨剉iew  鍒涘缓涓�涓熀浜庝綅鍥剧殑鍥惧舰涓婁笅鏂囧苟鎸囧畾澶у皬涓�
+//    UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.frame.size.width, view.frame.size.height), NO, 0.0);
+//    // renderInContext鍛堢幇鎺ュ彈鑰呭強鍏跺瓙鑼冨洿鍒版寚瀹氱殑涓婁笅鏂�
+//    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
+//    // 杩斿洖涓�涓熀浜庡綋鍓嶅浘褰笂涓嬫枃鐨勫浘鐗�
+//    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
+//    // 绉婚櫎鏍堥《鐨勫熀浜庡綋鍓嶄綅鍥剧殑鍥惧舰涓婁笅鏂�
+//    UIGraphicsEndImageContext();
+//    // 淇濆瓨鍥剧墖
+//    //UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
+//    return viewImage;
+    
+    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
+
+    // Render our snapshot into the image context
+
+    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
+
+    // Grab the image from the context
+
+    UIImage *complexViewImage = UIGraphicsGetImageFromCurrentImageContext();
+
+    // Finish using the context
+
+    UIGraphicsEndImageContext();
+
+    return complexViewImage;
+
+
+}
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneSDK.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneSDK.h"
new file mode 100644
index 0000000..5d38d76
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneSDK.h"
@@ -0,0 +1,89 @@
+//
+//  HDLLinPhoneSDK.h
+//  HDLLinPhoneSDK
+//
+//  Created by 闄堝惎鎵� on 2021/8/3.
+//  Copyright 漏 2021 闄堝惎鎵�. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+#import "HDLLinphoneCallDelegate.h"
+
+
+@interface HDLLinPhoneSDK : NSObject
+
+@property (nonatomic, weak) id<HDLLinphoneCallDelegate> hdlLinphoneCallDelegate;
+
+@property (assign, nonatomic) BOOL IsAutoJumpCallView;//鏄惁鑷姩璺宠浆鍛煎彨椤甸潰,false锛氭敹鍒版帹閫佸苟涓斿凡缁忔敹鍒皊ip鍛煎彨鎵嶈烦杞懠鍙〉闈�,true锛氬師鐢熸敹鍒板懠鍙┈涓婅烦杞懠鍙〉闈紝涓嶇瓑寰呮帹閫佽繃鏉�
+
+@property (assign, nonatomic) BOOL IsIncomingReceivedCallState;//
+
+/**
+ *  鍒涘缓鍗曚緥
+ *
+ *  @return 杩斿洖鍗曚緥瀵硅薄
+ */
++ (instancetype)instance;
+
+/**
+*  鐧诲綍璐︽埛
+*
+*  @param username   鐢ㄦ埛璐﹀彿
+*  @param pwd        瀵嗙爜
+*  @param domain     鍩熷悕
+*/
+-(void)login:(NSString*)username password:(NSString*)pwd domain:(NSString*) domain;
+
+/**
+*  鍒濆鍖杔inphone
+*/
+-(void)initalLinPhone;
+
+/**
+*  鍛煎彨
+*
+*  @param username   鐢ㄦ埛璐﹀彿
+*  @param title      椤甸潰鏍囬
+*/
+-(void)callWithUserName:(NSString*)username title:(NSString *)title;
+
+/**
+*  璺宠浆鍛煎彨椤甸潰
+*
+*  @param titleName   鏍囬
+*/
+-(void)gotoHDLLinphoneIntercomVC:(NSString*)titleName;
+
+
+/**
+*  娉ㄩ攢鐧诲綍
+*
+*/
+-(void)logoutAllLinphoneUser;
+
+
+/**
+*娓呴櫎閰嶇疆琛�
+*
+*/
+-(void)clearAllConfigs;
+
+/**
+*app杩涘叆鍚庡彴
+*
+*/
+-(void)enterBackground;
+
+/**
+*app鍞ら啋
+*
+*/
+-(void)becomactive;
+
+/**
+*绋嬪簭鏆傝
+*
+*/
+-(void)willResignActive;
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneSDK.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneSDK.m"
new file mode 100644
index 0000000..4befa5a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinPhoneSDK.m"
@@ -0,0 +1,149 @@
+//
+//  HDLLinPhoneSDK.m
+//  HDLLinPhoneSDK
+//
+//  Created by 闄堝惎鎵� on 2021/8/3.
+//  Copyright 漏 2021 闄堝惎鎵�. All rights reserved.
+//
+
+#import "HDLLinPhoneSDK.h"
+#import "HDLLinphoneManager.h"
+#import "HDLLinphoneIntercomVC.h"
+#import "HDLLinPhoneCommon.h"
+#import "HDLLPOnMonitorViewController.h"
+
+@interface HDLLinPhoneSDK()
+
+@end
+
+@implementation HDLLinPhoneSDK
+
++ (instancetype)instance{
+     static  HDLLinPhoneSDK *service = nil;
+     static dispatch_once_t onceToken;
+    
+     dispatch_once(&onceToken, ^{
+         service = [[HDLLinPhoneSDK alloc] init];
+         [NSNotificationCenter.defaultCenter addObserver:service
+                                                selector:@selector(registrationUpdate:)
+                                                    name:@"LinphoneRegistrationUpdate"
+                                                  object:nil];
+         [NSNotificationCenter.defaultCenter addObserver:service
+                                                selector:@selector(linphoneCallUpdate:)
+                                                    name:@"LinphoneCallUpdate"
+                                                  object:nil];
+
+         
+     });
+     return service;
+}
+
+-(void)dealloc{
+//    [NSNotificationCenter.defaultCenter remo];
+}
+
+-(void)login:(NSString*)username password:(NSString*)pwd domain:(NSString*) domain{
+    [HDLLinphoneManager.instance login:username password:pwd domain:domain];
+}
+
+- (void)registrationUpdate:(NSNotification *)notif {
+    LinphoneRegistrationState state = [[notif.userInfo objectForKey:@"state"] intValue];
+    if (state == LinphoneRegistrationFailed){
+        NSLog(@"鐧诲綍澶辫触");
+    }else if (state == LinphoneRegistrationCleared){
+        NSLog(@"鐧诲綍娓呯┖");
+    } else if (state == LinphoneRegistrationOk) {
+        
+//        HDLLinphoneIntercomVC *vc=[[HDLLinphoneIntercomVC alloc]init];
+//        [[HDLLinPhoneCommon topMostController] presentViewController:vc animated:YES completion:^{
+//            
+//        }];
+        NSLog(@"鐧诲綍鎴愬姛鍟�");
+    }
+}
+
+-(void)linphoneCallUpdate:(NSNotification *)notif{
+//    self.IsAutoJumpCallView=YES;
+    NSString *userName=[NSString stringWithFormat:@"%@",[notif.userInfo objectForKey:@"userName"]];
+   
+    LinphoneCallState state = [[notif.userInfo objectForKey:@"state"] intValue];
+    if (state == LinphoneCallIncomingReceived) {
+        [self.hdlLinphoneCallDelegate onIncomingCall:userName];
+        if(self.IsAutoJumpCallView){
+//                    NSString *callId=[NSString stringWithFormat:@"%@",[notif.userInfo objectForKey:@"callID"]];
+//                    BOOL hasVideo=(BOOL)[notif.userInfo objectForKey:@"hasVideo"];
+            
+                    HDLLinphoneIntercomVC *vc=[[HDLLinphoneIntercomVC alloc]init];
+//                    vc.CallId=callId;
+                    vc.hasVideo=YES;
+                    vc.hdlLinphoneCallDelegate=self.hdlLinphoneCallDelegate;
+                    vc.modalPresentationStyle = UIModalPresentationFullScreen;
+//                    self.IntercomVC=vc;
+                    [[HDLLinPhoneCommon topMostController] presentViewController:vc animated:YES completion:^{
+            
+                    }];
+        }
+    }
+}
+
+-(void)initalLinPhone{
+    [HDLLinphoneManager.instance initalLinPhonal];
+}
+
+-(void)callWithUserName:(NSString*)username title:(NSString *)title{
+    
+    HDLLPOnMonitorViewController *vc=[[HDLLPOnMonitorViewController alloc]init];
+//    vc.CallId=callId;
+//    vc.hasVideo=YES;
+    vc.hdlLinphoneCallDelegate=self.hdlLinphoneCallDelegate;
+    vc.modalPresentationStyle = UIModalPresentationFullScreen;
+    vc.userName=username;
+    vc.titleName=title;
+//    self.CallVC=vc;
+    [[HDLLinPhoneCommon topMostController] presentViewController:vc animated:YES completion:^{
+        
+    }];
+    
+}
+/**
+*  璺宠浆鍛煎彨椤甸潰
+*
+*  @param titleName   鏍囬
+*/
+-(void)gotoHDLLinphoneIntercomVC:(NSString*)titleName{
+    
+//    NSString *callId=[NSString stringWithFormat:@"%@",[notif.userInfo objectForKey:@"callID"]];
+//    BOOL hasVideo=(BOOL)[notif.userInfo objectForKey:@"hasVideo"];
+
+    HDLLinphoneIntercomVC *vc=[[HDLLinphoneIntercomVC alloc]init];
+//    vc.CallId=callId;
+    vc.hasVideo=YES;
+    vc.hdlLinphoneCallDelegate=self.hdlLinphoneCallDelegate;
+    vc.titleName=titleName;
+    vc.modalPresentationStyle = UIModalPresentationFullScreen;
+//    self.IntercomVC=vc;
+    [[HDLLinPhoneCommon topMostController] presentViewController:vc animated:YES completion:^{
+        
+    }];
+}
+
+-(void)logoutAllLinphoneUser{
+    [HDLLinphoneManager.instance removeAllAccounts];
+}
+
+-(void)clearAllConfigs{
+    
+}
+
+-(void)enterBackground{
+    [HDLLinphoneManager.instance enterBackgroundMode];
+}
+
+-(void)becomactive{
+    [HDLLinphoneManager.instance becomeActive];
+}
+
+-(void)willResignActive{
+//    [HDLLinphoneManager.instance willResignActive];
+}
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneAudioHelper.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneAudioHelper.h"
new file mode 100644
index 0000000..31a401c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneAudioHelper.h"
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone 
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef AudioHelper_h
+#define AudioHelper_h
+
+#import <AVFoundation/AVAudioSession.h>
+#import <Foundation/Foundation.h>
+
+@interface HDLLinphoneAudioHelper : NSObject
+
++ (NSArray *)bluetoothRoutes;
++ (AVAudioSessionPortDescription *)bluetoothAudioDevice;
++ (AVAudioSessionPortDescription *)builtinAudioDevice;
++ (AVAudioSessionPortDescription *)speakerAudioDevice;
++ (AVAudioSessionPortDescription *)audioDeviceFromTypes:(NSArray *)types;
+@end
+
+#endif /* AudioHelper_h */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneAudioHelper.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneAudioHelper.m"
new file mode 100644
index 0000000..42cb981
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneAudioHelper.m"
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import "HDLLinphoneAudioHelper.h"
+
+@implementation HDLLinphoneAudioHelper
+
++ (NSArray *)bluetoothRoutes {
+	return @[AVAudioSessionPortBluetoothHFP, AVAudioSessionPortCarAudio, AVAudioSessionPortBluetoothA2DP, AVAudioSessionPortBluetoothLE ];
+}
+
++ (AVAudioSessionPortDescription *)bluetoothAudioDevice {
+	return [HDLLinphoneAudioHelper audioDeviceFromTypes:[HDLLinphoneAudioHelper bluetoothRoutes]];
+}
+
++ (AVAudioSessionPortDescription *)builtinAudioDevice {
+	NSArray *builtinRoutes = @[ AVAudioSessionPortBuiltInMic ];
+	return [HDLLinphoneAudioHelper audioDeviceFromTypes:builtinRoutes];
+}
+
++ (AVAudioSessionPortDescription *)speakerAudioDevice {
+	NSArray *builtinRoutes = @[ AVAudioSessionPortBuiltInSpeaker ];
+	return [HDLLinphoneAudioHelper audioDeviceFromTypes:builtinRoutes];
+}
+
++ (AVAudioSessionPortDescription *)audioDeviceFromTypes:(NSArray *)types {
+	NSArray *routes = [[AVAudioSession sharedInstance] availableInputs];
+	for (AVAudioSessionPortDescription *route in routes) {
+		if ([types containsObject:route.portType]) {
+			return route;
+		}
+	}
+	return nil;
+}
+
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneCallDelegate.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneCallDelegate.h"
new file mode 100644
index 0000000..aa05a96
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneCallDelegate.h"
@@ -0,0 +1,40 @@
+//
+//  HDLLinphoneCallDelegate.h
+//  VoipTest
+//
+//  Created by 闄堝槈涔� on 2021/8/2.
+//
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+//寮�閿佹垚鍔熼�氱煡
+extern NSString *const HDLLPCallDelegateOpenDoorSuccess;
+
+@protocol HDLLinphoneCallDelegate <NSObject>
+//鎺ュ惉鍥炶皟
+-(void)onAnswerAction;
+
+//鎷掓帴鏉ョ數鍥炶皟
+-(void)onRejectCallAction;
+
+//寮�閿佸洖璋�
+-(void)onUnlockAction;
+
+//鎸傛柇锛堥�氳瘽缁撴潫锛�
+-(void)onHangUpAction:(int)callDuration;
+
+//閫氳瘽瑙嗛鎴浘涓婁紶
+-(void)onScreenshotSuccessfulAction:(UIImage *)image;
+
+//鏀跺埌瑙嗛鍛煎彨
+-(void)onIncomingCall:(NSString *)userName;
+
+@end
+
+@interface HDLLinphoneCallDelegate : NSObject
+@end
+
+NS_ASSUME_NONNULL_END
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneCallDelegate.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneCallDelegate.m"
new file mode 100644
index 0000000..66709cb
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneCallDelegate.m"
@@ -0,0 +1,14 @@
+//
+//  HDLLinphoneCallDelegate.m
+//  VoipTest
+//
+//  Created by 闄堝槈涔� on 2021/8/2.
+//
+
+#import "HDLLinphoneCallDelegate.h"
+
+NSString *const HDLLPCallDelegateOpenDoorSuccess = @"lcCallDelegateOpenDoorSuccess";
+
+@implementation HDLLinphoneCallDelegate
+
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneIntercomVC.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneIntercomVC.h"
new file mode 100644
index 0000000..a6c44c3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneIntercomVC.h"
@@ -0,0 +1,27 @@
+//
+//  HDLLinphoneIntercomVC.h
+//  VoipTest
+//
+//  Created by 闄堝槈涔� on 2021/8/2.
+//
+
+#import <UIKit/UIKit.h>
+#import "HDLLinphoneCallDelegate.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HDLLinphoneIntercomVC : UIViewController
+
+#pragma mark HDLLinphoneCallDelegate
+
+/**
+ 浜嬩欢浠g悊
+ */
+@property (nonatomic, weak) id<HDLLinphoneCallDelegate> hdlLinphoneCallDelegate;
+
+@property (strong, nonatomic) NSString *CallId;//鍛煎彨id
+@property (assign, nonatomic) BOOL hasVideo;//鏄惁鏀寔瑙嗛
+@property (strong, nonatomic) NSString *titleName;//鏍囬
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneIntercomVC.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneIntercomVC.m"
new file mode 100644
index 0000000..1ea7374
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneIntercomVC.m"
@@ -0,0 +1,796 @@
+//
+//  HDLLinphoneIntercomVC.m
+//  VoipTest
+//
+//  Created by 闄堝槈涔� on 2021/8/2.
+//
+
+#import "HDLLinphoneIntercomVC.h"
+#import "HDLLinphoneUtlis.h"
+#import <AVFoundation/AVFoundation.h>
+#import <Photos/Photos.h>
+#import <AudioToolbox/AudioToolbox.h>
+
+#import "HDLLinphoneManager.h"
+
+//#import "HDLLinPhoneSDK-Swift.h"
+@interface HDLLinphoneIntercomVC ()
+
+@property (nonatomic,strong) UIImage               *snapImage; //鎴浘
+
+@property (nonatomic, strong) UIButton *backButton;  //杩斿洖鎸夐挳
+@property (nonatomic, strong) UILabel *titleUILabel;  //鏍囬
+@property (nonatomic, strong) UIView *centerView;  //鍐呭鑳屾櫙View
+@property (nonatomic, strong) UIView *videoView;
+@property (nonatomic, strong) UIView *unlockView;
+@property (nonatomic, strong) UIButton *screenshotImgBtn;  //鎴浘
+@property (nonatomic, strong) UIButton *unlockImgBtn;  //寮�閿�
+@property (nonatomic, strong) UIButton *hangUpImgBtn;//鎸傛柇鎸夐挳
+@property (nonatomic, strong) UIButton *hangUpTextBtn;
+@property (nonatomic, strong) UIButton *answerImgBtn;//鎺ュ惉鎸夐挳
+@property (nonatomic, strong) UIButton *answerTextBtn;
+@property (nonatomic, strong) UIButton *calltimeBtn; //閫氳瘽鏃堕棿鎸夐挳
+//瀹氭椂鍣�
+@property (nonatomic,strong) dispatch_source_t countdownTimer;
+@property (nonatomic,strong) dispatch_source_t openDoorTimer;
+@property (nonatomic, assign) int openDoorTimeout;
+@property (nonatomic, assign) int callTimeout;
+@end
+
+@implementation HDLLinphoneIntercomVC{
+    BOOL isAnswer;//鏄惁宸茬粡鐐瑰嚮鎺ュ惉杩囦簡
+    
+    NSString * tipStr;
+    NSString * okStr;
+    NSString * saveToTheAlbumsStr;
+    NSString * operationFailedStr;
+    NSString * refuseStr;
+    NSString * answerStr;
+    NSString * unlockSuccessfullyStr;
+    NSString * callingStr;
+    NSString * hangUpStr;
+    NSString * endOfCallStr;
+    //    int openDoorTimeout;
+    //鍏ㄥ眬鍙橀噺
+    SystemSoundID sound;
+    CGFloat Height66;
+    bool isShowErrorAlert; //鏄惁宸茬粡寮圭獥杩囬敊璇彁绀烘爣璁帮紝鏍规嵁鎯呭喌浣跨敤
+}
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    self.view.backgroundColor = UIColor.whiteColor;
+    Height66 = GetRealWidth(66);
+    
+    [self initLlanguage];
+    [self initTopBarView];
+    [self initCentetView];
+    [self initData];
+    [self initESVideo];
+    //寮�濮嬮渿鍔�
+    [self StartReverseCall];
+    [self ShowCalltimeBtn:callingStr];
+    //娉ㄥ唽寮�閿佹垚鍔熺洃鍚�
+    [self addOpenSuccessAction];
+    
+    if (self.titleName&&self.titleName.length!=0) {
+        self.titleUILabel.text=self.titleName;
+    }
+//    self.titleUILabel.text=self.titleName;
+    
+//    [NSNotificationCenter.defaultCenter addObserver:self
+//                                           selector:@selector(registrationUpdate:)
+//                                               name:@"LinphoneRegistrationUpdate"
+//                                             object:nil];
+    [NSNotificationCenter.defaultCenter addObserver:self
+                                           selector:@selector(linphoneCallUpdate:)
+                                               name:@"LinphoneCallUpdate"
+                                             object:nil];
+    
+
+}
+
+- (void)linphoneCallUpdate:(NSNotification *)notif {
+    int state = [[notif.userInfo objectForKey:@"state"] intValue];
+    if ((state == LinphoneCallEnd || state == LinphoneCallError)) {//鎸傛柇浜�
+        NSLog(@"鎸傛柇鎴栧嚭閿欎簡");
+        [self showUIAlertViewWithBack:@"閫氳瘽缁撴潫"];
+        
+    }
+}
+
+-(void)initLlanguage{
+    NSString *languageName = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0];
+    
+    // 绠�浣撲腑鏂�
+    if ([languageName rangeOfString:@"zh-Hans"].location != NSNotFound) {
+        tipStr = @"鎻愮ず";
+        okStr = @"纭";
+        saveToTheAlbumsStr = @"宸蹭繚瀛樿嚦鎵嬫満鐩稿唽.";
+        operationFailedStr = @"鎿嶄綔澶辫触";
+        refuseStr = @"鎷掔粷";
+        answerStr = @"鎺ュ惉";
+        hangUpStr = @"鎸傛柇";
+        unlockSuccessfullyStr = @"寮�閿佹垚鍔�";
+        callingStr = @"鏉ョ數涓�...";
+        endOfCallStr = @"閫氳瘽缁撴潫";
+    }else{
+        tipStr = @"Prompt";
+        okStr = @"OK";
+        saveToTheAlbumsStr = @"Saved to the albums.";
+        operationFailedStr = @"Operation failed.";
+        refuseStr = @"Refuse";
+        answerStr = @"Answer";
+        hangUpStr = @"Hang up";
+        unlockSuccessfullyStr = @"Unlock successfully";
+        callingStr = @"Incoming call";
+        endOfCallStr = @"End of call";
+        
+    }
+}
+
+- (void)initTopBarView {
+    UIView *TopView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, APP_TOP_BAR_HEIGHT)];
+    TopView.backgroundColor = HEXCOLORA(0xF7F7F7,1.0);
+    //    [TopView addSubview:self.backButton];//闅愯棌杩斿洖鎸夐挳
+    [TopView addSubview:self.titleUILabel];
+    [self.view addSubview:TopView];
+    TopView.layer.shadowColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.25].CGColor;
+    TopView.layer.shadowOffset = CGSizeMake(0,0.5);
+    TopView.layer.shadowOpacity = 1;
+    TopView.layer.shadowRadius = 0;
+}
+
+- (UIButton *)backButton{
+    if (_backButton == nil) {
+        _backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, APP_STATUS_BAR_HEIGHT, 44, 44)];
+        [_backButton setImage:[UIImage imageNamed:@"ic_esvideo_on_back"] forState:UIControlStateNormal];
+        _backButton.imageEdgeInsets = UIEdgeInsetsMake(12,12,12,12);
+        [_backButton.imageView setContentMode:UIViewContentModeScaleAspectFit];
+        [_backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
+    }
+    return _backButton;
+}
+
+-(void)backAction{
+    
+    [self dismissViewControllerAnimated:YES completion:nil];
+    //    [self dismissViewControllerAnimated:YES completion:NULL];
+    
+}
+
+-(UILabel *)titleUILabel{
+    if (_titleUILabel == Nil) {
+        _titleUILabel = [[UILabel alloc] initWithFrame:CGRectMake(90, APP_STATUS_BAR_HEIGHT, self.view.frame.size.width - 180, 44)];
+        _titleUILabel.font = [UIFont fontWithName:APP_UIFont_BOLD size:18.0];
+        _titleUILabel.textColor = TextColor;
+        _titleUILabel.text = @"";
+        _titleUILabel.textAlignment = NSTextAlignmentCenter;
+    }
+    return _titleUILabel;
+}
+
+- (void)initCentetView {
+    [self.view addSubview:self.centerView];
+    //    [self.centerView addSubview:self.collectButton];
+    [self.centerView addSubview:self.videoView];
+    [self.centerView addSubview:self.unlockView];
+    [self.unlockView addSubview:self.screenshotImgBtn];
+    [self.unlockView addSubview:self.unlockImgBtn];
+    [self.centerView addSubview:self.hangUpImgBtn];
+    [self.centerView addSubview:self.hangUpTextBtn];
+    [self.centerView addSubview:self.answerImgBtn];
+    [self.centerView addSubview:self.answerTextBtn];
+    [self.centerView addSubview:self.calltimeBtn];
+}
+
+- (UIView *)centerView{
+    if (_centerView == nil) {
+        _centerView = [[UIButton alloc] initWithFrame:CGRectMake(0, APP_TOP_BAR_HEIGHT, APP_SCREEN_WIDTH, APP_VISIBLE_HEIGHT)];
+        _centerView.backgroundColor = UIColor.whiteColor;
+    }
+    return _centerView;
+}
+
+//-(void)setRadiusWithView:(UIView *)mView{
+//    //椤堕儴鍦嗚
+//    UIRectCorner corners = UIRectCornerTopLeft | UIRectCornerTopRight;
+//    if (@available(iOS 11.0, *)) {
+//        mView.layer.cornerRadius = 20;
+//        mView.layer.maskedCorners =  (CACornerMask)corners;
+//    }else{
+//        UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:mView.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(20,20)];
+//        //鍒涘缓 layer
+//        CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
+//        maskLayer.frame = mView.bounds;
+//        //璧嬪��
+//        maskLayer.path = maskPath.CGPath;
+//        mView.layer.mask = maskLayer;
+//    }
+//}
+
+-(UIView *)videoView{
+    if (_videoView == Nil) {
+        _videoView =  [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, GetRealWidth(210))];
+        _videoView.backgroundColor = UIColor.lightGrayColor;
+        _videoView.layer.shadowColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.25].CGColor;
+        _videoView.layer.shadowOffset = CGSizeMake(0,0.5);
+        _videoView.layer.shadowOpacity = 1;
+        _videoView.layer.shadowRadius = 0;
+    }
+    return _videoView;
+}
+
+
+- (UIView *)unlockView{
+    if (_unlockView == nil) {
+        _unlockView = [[UIView alloc] initWithFrame:CGRectMake(0, GetRealWidth(210), APP_SCREEN_WIDTH, GetRealWidth(72))];
+        _unlockView.backgroundColor = HEXCOLORA(0x232323, 1.0);
+        _unlockView.layer.backgroundColor = [UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1.0].CGColor;
+        _unlockView.layer.shadowColor = [UIColor colorWithRed:204/255.0 green:204/255.0 blue:204/255.0 alpha:0.4].CGColor;
+        _unlockView.layer.shadowOffset = CGSizeMake(0,0.5);
+        _unlockView.layer.shadowOpacity = 1;
+        _unlockView.layer.shadowRadius = 0;
+    }
+    return _unlockView;
+}
+//鎴浘鎸夐挳
+- (UIButton *)screenshotImgBtn{
+    if (_screenshotImgBtn == nil) {
+        _screenshotImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(44), GetRealWidth(44))];
+        [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_unselect"] forState:UIControlStateNormal];
+        //        [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_select"] forState:UIControlStateSelected];
+        [_screenshotImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
+        [_screenshotImgBtn addTarget:self action:@selector(screenshotAction) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
+        [_screenshotImgBtn addTarget:self action:@selector(screenshotDownAction) forControlEvents:UIControlEventTouchDown];
+        _screenshotImgBtn.adjustsImageWhenHighlighted = NO;
+        _screenshotImgBtn.center = CGPointMake(APP_SCREEN_WIDTH/4, GetRealWidth(38));
+    }
+    return _screenshotImgBtn;
+}
+//鎴浘鎸夐挳鎸変笅浜嬩欢
+-(void)screenshotDownAction{
+    [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_select"] forState:UIControlStateNormal];
+}
+//鎴浘鎸夐挳鎶捣浜嬩欢
+-(void)screenshotAction{
+    [_screenshotImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_takephoto_unselect"] forState:UIControlStateNormal];
+    
+    //鎴浘
+    [HDLLinphoneManager.instance snapShotWithView:self.videoView];
+}
+
+- (UIButton *)unlockImgBtn{
+    if (_unlockImgBtn == nil) {
+        _unlockImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0,0, GetRealWidth(44), GetRealWidth(44))];
+        [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_unselect"] forState:UIControlStateNormal];
+        //        [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_select"] forState:UIControlStateSelected];
+        [_unlockImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
+        [_unlockImgBtn addTarget:self action:@selector(unlockAction) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];
+        [_unlockImgBtn addTarget:self action:@selector(unlockDownAction) forControlEvents:UIControlEventTouchDown];
+        _unlockImgBtn.adjustsImageWhenHighlighted = NO;
+        _unlockImgBtn.center = CGPointMake((APP_SCREEN_WIDTH/4) * 3, GetRealWidth(38));
+    }
+    return _unlockImgBtn;
+}
+
+-(void)unlockDownAction{
+    [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_select"] forState:UIControlStateNormal];
+    
+}
+//鐐瑰嚮瑙i攣
+-(void)unlockAction{
+    [_unlockImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_unlock_unselect"] forState:UIControlStateNormal];
+    //寮�閿�
+    if(self.hdlLinphoneCallDelegate != NULL){
+        [self.hdlLinphoneCallDelegate onUnlockAction];
+    }
+}
+
+#pragma 鎸傛柇鍜屽紑閿�
+//鎸傛柇 鍥炬爣鎸夐挳
+- (UIButton *)hangUpImgBtn{
+    if (_hangUpImgBtn == nil) {
+        _hangUpImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, Height66, Height66)];
+        [_hangUpImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_hangup"] forState:UIControlStateNormal];
+        //        [_hangUpImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_hangup"] forState:UIControlStateSelected];
+        [_hangUpImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
+        [_hangUpImgBtn addTarget:self action:@selector(hangUpAction) forControlEvents:UIControlEventTouchUpInside];
+        _hangUpImgBtn.center = CGPointMake(APP_SCREEN_WIDTH/4, GetRealHeight(452) + Height66/2);
+    }
+    return _hangUpImgBtn;
+}
+
+//鎸傛柇鎸夐挳浜嬩欢
+-(void)hangUpAction{
+    //1.鍥炶皟浜嬩欢
+    if(self.hdlLinphoneCallDelegate != NULL){
+        if(isAnswer){
+            //濡傛灉涔嬪墠宸茬粡鎺ュ惉浜嗭紝鍥炶皟鏄寕鏂�
+            [self.hdlLinphoneCallDelegate onHangUpAction:_callTimeout];
+        }else{
+            //濡傛灉涔嬪墠娌℃帴鍚簡锛屽洖璋冩槸鎷掓帴
+            [self.hdlLinphoneCallDelegate onRejectCallAction];
+        }
+    }
+    //2.椤甸潰鍏抽棴
+    [self backAction];
+}
+//鎷掓帴 鏂囨湰鎸夐挳
+- (UIButton *)hangUpTextBtn{
+    if (_hangUpTextBtn == nil) {
+        _hangUpTextBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(100), GetRealWidth(20))];
+        [_hangUpTextBtn setTitle:@"鎷掔粷" forState:UIControlStateNormal];
+        _hangUpTextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
+        _hangUpTextBtn.titleLabel.font = [UIFont fontWithName:APP_UIFont size:14.0];
+        [_hangUpTextBtn setTitleColor:TextColor forState:UIControlStateNormal];
+        [_hangUpTextBtn setTitleColor:TextSelectColor forState:UIControlStateSelected];
+        [_hangUpTextBtn addTarget:self action:@selector(screenshotAction) forControlEvents:UIControlEventTouchUpInside];
+        _hangUpTextBtn.center = CGPointMake(_hangUpImgBtn.center.x, GetRealHeight(530));
+        
+    }
+    return _hangUpTextBtn;
+}
+//鎺ュ惉 鍥炬爣鎸夐挳
+- (UIButton *)answerImgBtn{
+    if (_answerImgBtn == nil) {
+        _answerImgBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, Height66, Height66)];
+        [_answerImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_answer"] forState:UIControlStateNormal];
+        //        [_answerImgBtn setImage:[UIImage imageNamed:@"ic_esvideo_on_answer"] forState:UIControlStateSelected];
+        [_answerImgBtn.imageView setContentMode:UIViewContentModeScaleAspectFit];
+        [_answerImgBtn addTarget:self action:@selector(answerIAction) forControlEvents:UIControlEventTouchUpInside];
+        
+        _answerImgBtn.center = CGPointMake((APP_SCREEN_WIDTH/4)*3, GetRealHeight(452) + Height66/2);
+    }
+    return _answerImgBtn;
+}
+//鐐瑰嚮鎺ュ惉浜嬩欢
+-(void)answerIAction{
+    [self stopPlaySystemSound];
+    
+//    [[HDLCallManager instance] acceptCallByCallID:self.CallId hasVideo:self.hasVideo];
+    [[HDLLinphoneManager instance] acceptCall];
+    /// 寮�鍚璁�
+//    [self startTalk];
+    
+    _answerImgBtn.hidden = YES;
+    _answerTextBtn.hidden = YES;
+    
+    //鎸傛柇鎸夐挳绉诲姩涓棿
+    _hangUpImgBtn.center = CGPointMake(APP_CONTENT_WIDTH / 2, _hangUpImgBtn.center.y);
+    _hangUpTextBtn.center = CGPointMake(APP_CONTENT_WIDTH / 2, _hangUpTextBtn.center.y);
+    
+    [_hangUpTextBtn setTitle:hangUpStr forState:UIControlStateNormal];
+    //寮�濮嬭鏃�
+    _callTimeout = 0;
+    [self startCountdown];
+    isAnswer = YES;
+    
+    if(self.hdlLinphoneCallDelegate != NULL){
+        [self.hdlLinphoneCallDelegate onAnswerAction];
+    }
+    
+//    [[HDLCallManager instance] acceptCallWithCall: hasVideo:YES];
+//    let call = HDLCallManager.instance().callByCallId(callId: callId)
+//    if (call == nil || call?.state != Call.State.IncomingReceived) {
+//        // The application is not yet registered or the call is not yet received, mark the call as accepted. The audio session must be configured here.
+//        HDLCallManager.configAudioSession(audioSession: AVAudioSession.sharedInstance())
+//        callInfo?.accepted = true
+//        callInfos.updateValue(callInfo!, forKey: uuid)
+//        HDLCallManager.instance().providerDelegate.endCallNotExist(uuid: uuid, timeout: .now() + 10)
+//    } else {
+//        HDLCallManager.instance().acceptCall(call: call!, hasVideo: call!.params?.videoEnabled ?? false)
+//    }
+}
+
+-(void)setAnswerBtnEnable:(BOOL)ISEnable{
+    [_answerImgBtn setEnabled:ISEnable];
+    [_answerTextBtn setEnabled:ISEnable];
+}
+//鎺ュ惉鏂囨湰鎸夐挳
+- (UIButton *)answerTextBtn{
+    if (_answerTextBtn == nil) {
+        _answerTextBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(100), GetRealWidth(20))];
+        [_answerTextBtn setTitle:@"鎺ュ惉" forState:UIControlStateNormal];
+        _answerTextBtn.titleLabel.font = [UIFont fontWithName:APP_UIFont size:14.0];
+        _answerTextBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
+        //        _unlockTextBtn.titleLabel.textColor = TextColor;
+        [_answerTextBtn setTitleColor:TextColor forState:UIControlStateNormal];
+        [_answerTextBtn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
+        [_answerTextBtn setTitleColor:TextSelectColor forState:UIControlStateSelected];
+        [_answerTextBtn addTarget:self action:@selector(answerIAction) forControlEvents:UIControlEventTouchUpInside];
+        _answerTextBtn.center = CGPointMake(_answerImgBtn.center.x, GetRealHeight(530));
+    }
+    return _answerTextBtn;
+}
+//閫氳瘽璁板綍璁℃椂鎸夐挳
+- (UIButton *)calltimeBtn{
+    if (_calltimeBtn == nil) {
+        _calltimeBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, GetRealWidth(100), GetRealWidth(40))];
+        _calltimeBtn.backgroundColor = HEXCOLORA(0x000000, 0.6);
+        [_calltimeBtn setTitle:@"00:00" forState:UIControlStateNormal];
+        _calltimeBtn.titleLabel.font = [UIFont fontWithName:APP_UIFont size:14.0];
+        _calltimeBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
+        [_calltimeBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
+        _calltimeBtn.hidden = YES;
+        _calltimeBtn.layer.cornerRadius = 12;
+        _calltimeBtn.center = CGPointMake(APP_CONTENT_WIDTH/2, GetRealWidth(340));
+    }
+    return _calltimeBtn;
+}
+
+#pragma mark - 閫氳瘽鏃堕棿鏄剧ず澶勭悊
+-(void)ShowTime:(int)nowTime {
+    if(_calltimeBtn.hidden) _calltimeBtn.hidden = NO;
+    NSString *timeStr = [self timeFormatted:nowTime];
+    [self setCalltimeButtonText:timeStr isTime:YES];
+}
+
+-(void)ShowCalltimeBtn:(NSString*)mesStr{
+    if(_calltimeBtn.hidden) _calltimeBtn.hidden = NO;
+    [self setCalltimeButtonText:mesStr isTime:NO];
+}
+
+/*
+ 鏍规嵁鏂囧瓧璋冩暣鎸夐挳瀹�
+ */
+-(void)setCalltimeButtonText:(NSString*) mesStr isTime:(BOOL)isTime
+{
+    [_calltimeBtn setTitle:mesStr forState:UIControlStateNormal];
+    if(isTime){
+        _calltimeBtn.frame = CGRectMake(0, 0, GetRealWidth(80), GetRealWidth(30));
+    }else{
+        _calltimeBtn.frame = CGRectMake(0, 0, GetRealWidth(115), GetRealWidth(30));
+    }
+    _calltimeBtn.center = CGPointMake(APP_SCREEN_WIDTH/2, GetRealWidth(340));
+}
+
+//鏃堕棿鏍煎紡鍖�
+- (NSString *)timeFormatted:(int)totalSeconds
+{
+    int seconds = totalSeconds % 60;
+    int minutes = (totalSeconds / 60);
+    return [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
+    
+}
+
+//- (int *)getTextWidth:(UIButton*) btn
+//{
+//    int textWidth = 0;
+//    //   聽 CGSize size = [btn.titleLabel.textsizeWithFont:[UIFontboldSystemFontOfSize:15]constrainedToSize:contentMaxSizes lineBreakMode:UILineBreakModeCharacterWrap];
+//    //    textWidth = (int)fontSize.Width;
+//    return textWidth;
+//}
+
+
+
+/** 寮�鍚�掕鏃� */
+- (void)startCountdown {
+    
+    if (_callTimeout > 100) {
+        return;
+    }
+    _callTimeout = 0;
+    // GCD瀹氭椂鍣�
+    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
+    
+    _countdownTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
+    
+    dispatch_source_set_timer(_countdownTimer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0); //姣忕鎵ц
+    
+    dispatch_source_set_event_handler(_countdownTimer, ^{
+        WEAKSELF_AT
+        if(weakSelf_AT.callTimeout >= 100 ){// 璁℃椂缁撴潫
+            // 鍏抽棴瀹氭椂鍣�
+            dispatch_source_cancel(weakSelf_AT.countdownTimer);
+            
+            dispatch_async(dispatch_get_main_queue(), ^{
+                NSLog(@"瓒呮椂");
+                [weakSelf_AT backAction];
+                
+            });
+            
+        }else{// 璁℃椂涓�
+            weakSelf_AT.callTimeout++;
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [weakSelf_AT ShowTime:weakSelf_AT.callTimeout];
+            });
+            
+            
+        }
+    });
+    
+    // 寮�鍚畾鏃跺櫒
+    dispatch_resume(_countdownTimer);
+    
+}
+
+#pragma 寮�閿佹垚鍔�
+//寮�閿佹垚鍔熷悗锛屽紑閿佹寜閽鐢紝鍊掕鏃剁粨鏉熷悗閲嶆柊鍏佽鐐瑰嚮
+-(void)setOpenDoorSuccess{
+    [self setUnlock:NO];
+    _openDoorTimeout = 0;
+    [self startOpenDoorCountdown];
+    [self showUIAlertView:unlockSuccessfullyStr];
+    
+}
+//璁剧疆寮�閿佹寜閽槸鍚︿负鍚敤鐘舵��
+-(void)setUnlock:(BOOL)isEnable{
+    [self.unlockImgBtn setEnabled:isEnable];
+}
+
+
+
+/** 寮�鍚�掕鏃� */
+- (void)startOpenDoorCountdown {
+    
+    if (_openDoorTimeout > 10) {
+        return;
+    }
+    
+    _openDoorTimeout = 0;
+    
+    // GCD瀹氭椂鍣�
+    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
+    
+    _openDoorTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
+    
+    dispatch_source_set_timer(_openDoorTimer, dispatch_walltime(NULL, 0), 1.0 * NSEC_PER_SEC, 0); //姣忕鎵ц
+    
+    dispatch_source_set_event_handler(_openDoorTimer, ^{
+        WEAKSELF_AT
+        if(weakSelf_AT.openDoorTimeout >= 10 ){// 璁℃椂缁撴潫
+            // 鍏抽棴瀹氭椂鍣�
+            dispatch_source_cancel(weakSelf_AT.openDoorTimer);
+            
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [weakSelf_AT setUnlock:YES];
+                
+            });
+            
+        }else{// 璁℃椂涓�
+            weakSelf_AT.openDoorTimeout++;
+            
+        }
+    });
+    
+    // 寮�鍚畾鏃跺櫒
+    dispatch_resume(_openDoorTimer);
+    
+}
+
+
+
+#pragma SDK鍙瀵硅 鍔熻兘閮ㄥ垎
+//鍒濆鍖栧彲瑙嗗璁睸DK
+-(void)initESVideo{
+    //TODO:
+    
+    linphone_core_set_native_video_window_id([HDLLinphoneManager getLc], (__bridge void *)(self.videoView));
+}
+
+//鍒濆鍖栧弬鏁�
+-(void)initData{
+    //    _titleUILabel.text = [[LCApiKit sharedInstance] currentDeviceName];
+    [_hangUpTextBtn setTitle:refuseStr forState:UIControlStateNormal];
+    [_answerTextBtn setTitle:answerStr forState:UIControlStateNormal];
+    
+}
+
+// 鏆傚仠鎾斁
+- (void)stopPlay {
+    //TODO:
+    
+    [HDLLinphoneManager.instance endCall];
+}
+
+// 寮�濮嬫挱鏀�
+- (void)startPlay {
+    //TODO:
+    
+//    [HDLLinphoneManager.instance fetchVideo];
+}
+
+// 寮�鍚璁�
+- (void)startTalk {
+    if (!isAnswer) {
+        //瀵硅寮�鍚�
+        [self startPlay];
+    }
+}
+
+/**
+ 寮�濮嬪弽鍛�
+ */
+-(void)StartReverseCall{
+    [self startPlaySystemSound];
+    //TODO:
+    
+}
+
+//-(NSString *)getCurrentdateInterval
+//{
+//    NSDate *datenow = [NSDate date];
+//    NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)([datenow timeIntervalSince1970]*1000)];
+//    return timeSp;
+//}
+
+//寮圭獥鎻愮ず锛岀‘璁ゅ悗娌″姩浣�
+-(void)showUIAlertView:(NSString *)mes
+{
+    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:tipStr message:mes preferredStyle:UIAlertControllerStyleAlert];
+    [alertController addAction:[UIAlertAction actionWithTitle:okStr style:UIAlertActionStyleCancel handler:nil]];
+    [self presentViewController:alertController animated:YES completion:nil];
+}
+
+///閿欒淇℃伅鎻愮ず锛岀偣鍑荤‘璁ゅ叧闂綋鍓嶉〉闈�
+-(void)showUIAlertViewWithBack:(NSString *)mes
+{
+    isShowErrorAlert = true;
+    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:tipStr message:mes preferredStyle:UIAlertControllerStyleAlert];
+    [alertController addAction:[UIAlertAction actionWithTitle:okStr style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
+        [self backAction];
+    }]];
+    
+    [self presentViewController:alertController animated:YES completion:nil];
+}
+
+///搴旂敤绋嬩細鎸傝捣 浼氳皟鐢� applicationWillResignActive 鏂规硶
+- (void)onResignActive:(id)sender {
+    [self stopPlay];
+}
+
+
+#pragma viewDidAppear
+-(void)viewDidAppear:(BOOL)animated{
+    //杩欎釜鏂规硶璇锋牴鎹瓵pp鐨勫叿浣撴儏鍐佃皟鐢�
+    
+}
+
+-(void)viewWillDisappear:(BOOL)animated{
+    NSLog(@"viewWillDisappear");
+    [super viewWillDisappear:animated];
+    [self stopPlaySystemSound];
+    //闃叉鐢ㄦ埛涓嶆寜鎸傛柇锛屾垨鑰呬笉绛夋敹鍒板鏂圭殑鎸傛柇锛岀偣鍑昏繑鍥炴寜閽��
+    //1.鏆傚仠SDK鐩稿叧鎾斁
+    [self stopPlay];
+    //2.Delegate閲婃斁
+    self.hdlLinphoneCallDelegate = nil;
+    //3.瀹氭椂鍣ㄩ噴鏀�
+    if(_openDoorTimer){
+        dispatch_source_cancel(_openDoorTimer);
+        _openDoorTimer = nil; // OK
+    }
+    if(_countdownTimer){
+        dispatch_source_cancel(_countdownTimer);
+        _countdownTimer = nil; // OK
+        
+    }
+    
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+    
+}
+
+-(void)dealloc{
+    NSLog(@"==============dealloc  1");
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+- (void)willEnterForeground:(NSNotification*)notification{
+    NSLog(@"willEnterForeground");
+    
+}
+///
+- (void)willEnterBackground:(NSNotification *)notification {
+    NSLog(@"willEnterBackground");
+}
+
+#pragma 鎴浘鎴愬姛鍚� 淇濆瓨鍥剧墖鍒扮浉鍐岀浉鍏�
+- (void)saveImageToPhotosAlbum:(UIImage *)savedImage
+{
+    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
+    if (status == PHAuthorizationStatusNotDetermined)
+    {
+        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
+            if(status == PHAuthorizationStatusAuthorized)
+            {
+                UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
+            }
+        }];
+    }
+    else
+    {
+        if (status == PHAuthorizationStatusAuthorized)
+        {
+            UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
+        }
+    }
+}
+
+// 鎸囧畾鍥炶皟鏂规硶
+- (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
+{
+    NSString *message = nil;
+    if (!error) {
+        message = saveToTheAlbumsStr;
+        // 鎴浘鎴愬姛鍥炶皟
+        if(self.hdlLinphoneCallDelegate != NULL){
+            [self.hdlLinphoneCallDelegate onScreenshotSuccessfulAction:image];
+        }
+    }
+    else
+    {
+        message = operationFailedStr;
+    }
+    [self showUIAlertView:message];
+}
+
+/// 淇濆瓨瑙嗛鎴浘
+- (void)saveThumbImage {
+    //TODO:
+    
+}
+
+#pragma 闇囧姩瀹炵幇璨屼技鍜孲DK鍐茬獊 涓嶈兘瀹炵幇闇囧姩
+//寮�濮嬫挱鏀剧殑鏃跺�欒皟鐢�
+-(void)startPlaySystemSound{
+//    return;
+    //    //闇囧姩鐨勬彁绀烘枃浠跺悕鏀惧埌璧勬簮鐩綍涓�
+    //    NSString *path = [[NSBundle mainBundle] pathForResource:@"ring" ofType:@"wav"];
+    //    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &sound);
+    //鍒嗗埆娉ㄥ唽閾冨0鍜岄渿鍔ㄥ畬鍚庣殑鍥炶皟
+    AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, HDLLPVibrationCompleteCallback, NULL);
+    //    AudioServicesAddSystemSoundCompletion(sound, NULL, NULL, soundCompleteCallback, NULL);
+    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//寮�濮嬮渿鍔�
+    //    AudioServicesPlaySystemSound(sound);//寮�濮嬫挱鏀鹃搩澹�
+}
+
+//鎵嬪姩鍋滄鎾斁鐨勬椂鍊欒皟鐢�
+- (void)stopPlaySystemSound{
+//    return;
+    NSLog(@"stop PlaySystemSound");
+    HDLLPStopRingAndVibration();
+}
+
+//鍋滄鍝嶉搩鍜岄渿鍔紝绉婚櫎鍥炶皟骞跺鐞嗘帀閾冨0鍜岄渿鍔�
+void HDLLPStopRingAndVibration() {
+    AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);
+    //    AudioServicesRemoveSystemSoundCompletion(sound);
+    AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);
+    //    AudioServicesDisposeSystemSoundID(sound);
+}
+
+//闇囧姩瀹屾垚鍥炶皟锛屽洜涓洪渿鍔ㄤ竴涓嬩究浼氳皟鐢ㄤ竴娆★紝杩欓噷寤惰繜800ms鍐嶇户缁渿鍔紝鍜屽井淇″樊涓嶅锛屾椂闂撮暱鐭彲鑷繁鎺у埗銆傚弬鏁皊ound鍗充负娉ㄥ唽鍥炶皟鏃朵紶鐨勭涓�涓弬鏁�
+void HDLLPVibrationCompleteCallback(SystemSoundID sound,void * clientData) {
+    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(800 * NSEC_PER_MSEC)), dispatch_get_global_queue(0, 0), ^{
+        AudioServicesPlaySystemSound(sound);
+    });
+}
+
+////閾冨0鎾斁瀹屾垚鍥炶皟锛岃繖绉嶆柟娉晉鎾斁鐨勯煶棰戦檺鍒跺湪30绉掑唴锛屾挱鏀惧畬鐩存帴鍝嶉搩鍜岄渿鍔�
+//void soundCompleteCallback(SystemSoundID sound,void * clientData) {
+//
+//    stopRingAndVibration();
+//}
+
+
+#pragma mark - 寮�閿佹垚鍔熼�氱煡浜嬩欢
+- (void)addOpenSuccessAction {
+    
+    [[NSNotificationCenter defaultCenter] removeObserver:self
+                                                    name:HDLLPCallDelegateOpenDoorSuccess
+                                                  object:nil];
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self
+                                             selector:@selector(setOpenDoorSuccess)
+                                                 name:HDLLPCallDelegateOpenDoorSuccess
+                                               object:nil];
+}
+
+- (void)removeOpenSuccessAction {
+    
+    [[NSNotificationCenter defaultCenter] removeObserver:self
+                                                    name:HDLLPCallDelegateOpenDoorSuccess
+                                                  object:nil];
+}
+
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneLog.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneLog.h"
new file mode 100644
index 0000000..9899968
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneLog.h"
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone 
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import "HDLLinphoneManager.h"
+//#import <asl.h>
+//#import <os/log.h>
+#define LOGV(level, ...) [HDLLinphoneLog log:level file:__FILE__ line:__LINE__ format:__VA_ARGS__]
+#define LOGD(...) LOGV(ORTP_DEBUG, __VA_ARGS__)
+#define LOGI(...) LOGV(ORTP_MESSAGE, __VA_ARGS__)
+#define LOGW(...) LOGV(ORTP_WARNING, __VA_ARGS__)
+#define LOGE(...) LOGV(ORTP_ERROR, __VA_ARGS__)
+#define LOGF(...) LOGV(ORTP_FATAL, __VA_ARGS__)
+
+@interface HDLLinphoneLog : NSObject {
+}
+
++ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ...;
++ (void)enableLogs:(OrtpLogLevel)level;
+
+void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args);
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneLog.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneLog.m"
new file mode 100644
index 0000000..93c59fc
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneLog.m"
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import "HDLLinphoneLog.h"
+#import <asl.h>
+#import <os/log.h>
+
+#ifdef USE_CRASHLYTHICSS
+#import <Crashlytics/Crashlytics.h>
+#endif
+
+@implementation HDLLinphoneLog
+
+#define FILE_SIZE 17
+#define DOMAIN_SIZE 3
+
++ (NSString *)cacheDirectory {
+	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
+	NSString *cachePath = [paths objectAtIndex:0];
+	BOOL isDir = NO;
+	NSError *error;
+	// cache directory must be created if not existing
+	if (![[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
+		if (![[NSFileManager defaultManager] createDirectoryAtPath:cachePath
+									   withIntermediateDirectories:NO
+														attributes:nil
+															 error:&error]) {
+//			LOGE(@"Could not create cache directory: %@", error);
+		}
+	}
+	return cachePath;
+}
+
++ (void)log:(OrtpLogLevel)severity file:(const char *)file line:(int)line format:(NSString *)format, ... {
+	va_list args;
+	va_start(args, format);
+	NSString *str = [[NSString alloc] initWithFormat:format arguments:args];
+	const char *utf8str = [str cStringUsingEncoding:NSString.defaultCStringEncoding];
+	const char *filename = strchr(file, '/') ? strrchr(file, '/') + 1 : file;
+	ortp_log(severity, "(%*s:%-4d) %s", FILE_SIZE, filename + MAX((int)strlen(filename) - FILE_SIZE, 0), line, utf8str);
+	va_end(args);
+}
+
++ (void)enableLogs:(OrtpLogLevel)level {
+	BOOL enabled = (level >= ORTP_DEBUG && level < ORTP_ERROR);
+	static BOOL stderrInUse = NO;
+	if (!stderrInUse) {
+		asl_add_log_file(NULL, STDERR_FILENO);
+		stderrInUse = YES;
+	}
+	linphone_core_set_log_collection_path([self cacheDirectory].UTF8String);
+	linphone_core_set_log_handler(linphone_iphone_log_handler);
+	linphone_core_enable_log_collection(enabled);
+	if (level == 0) {
+		linphone_core_set_log_level(ORTP_FATAL);
+		ortp_set_log_level("ios", ORTP_FATAL);
+		NSLog(@"I/%s/Disabling all logs", ORTP_LOG_DOMAIN);
+	} else {
+		NSLog(@"I/%s/Enabling %s logs", ORTP_LOG_DOMAIN, (enabled ? "all" : "application only"));
+		linphone_core_set_log_level(level);
+		ortp_set_log_level("ios", level == ORTP_DEBUG ? ORTP_DEBUG : ORTP_MESSAGE);
+	}
+}
+
+#pragma mark - Logs Functions callbacks
+
+void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args) {
+	NSString *format = [[NSString alloc] initWithUTF8String:fmt];
+	NSString *formatedString = [[NSString alloc] initWithFormat:format arguments:args];
+	NSString *lvl;
+
+	if (!domain)
+		domain = "lib";
+	// since \r are interpreted like \n, avoid double new lines when logging network packets (belle-sip)
+	// output format is like: I/ios/some logs. We truncate domain to **exactly** DOMAIN_SIZE characters to have
+	// fixed-length aligned logs
+	switch (lev) {
+		case ORTP_FATAL:
+			lvl = @"Fatal";
+			break;
+		case ORTP_ERROR:
+			lvl = @"Error";
+			break;
+		case ORTP_WARNING:
+			lvl = @"Warning";
+			break;
+		case ORTP_MESSAGE:
+			lvl = @"Message";
+			break;
+		case ORTP_DEBUG:
+			lvl = @"Debug";
+			break;
+		case ORTP_TRACE:
+			lvl = @"Trace";
+			break;
+		case ORTP_LOGLEV_END:
+			return;
+	}
+	if ([formatedString containsString:@"\n"]) {
+		NSArray *myWords = [[formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]
+			componentsSeparatedByString:@"\n"];
+		for (int i = 0; i < myWords.count; i++) {
+			NSString *tab = i > 0 ? @"\t" : @"";
+			if (((NSString *)myWords[i]).length > 0) {
+#ifdef USE_CRASHLYTHICSS
+				CLSNSLog(@"[%@] %@%@", lvl, tab, (NSString *)myWords[i]);
+#else
+				NSLog(@"[%@] %@%@", lvl, tab, (NSString *)myWords[i]);
+#endif
+
+			}
+		}
+	} else {
+#ifdef USE_CRASHLYTHICSS
+		CLSNSLog(@"[%@] %@", lvl, [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]);
+#else
+		NSLog(@"[%@] %@", lvl, [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]);
+#endif
+	}
+}
+
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneManager.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneManager.h"
new file mode 100644
index 0000000..0e69526
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneManager.h"
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone 
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import <Foundation/Foundation.h>
+#import <SystemConfiguration/SCNetworkReachability.h>
+#import <AudioToolbox/AudioToolbox.h>
+#import <Photos/Photos.h>
+#import <CoreTelephony/CTCallCenter.h>
+
+#import <sqlite3.h>
+
+//#import "IASKSettingsReader.h"
+//#import "IASKSettingsStore.h"
+//#import "IASKAppSettingsViewController.h"
+//#import "FastAddressBook.h"
+//#import "InAppProductsManager.h"
+
+#include "linphone/linphonecore.h"
+#include "bctoolbox/list.h"
+//#import "OrderedDictionary.h"
+#import "HDLLinphoneProviderDelegate.h"
+#import <UIKit/UIKit.h>
+extern NSString *const LINPHONERC_APPLICATION_KEY;
+
+extern NSString *const kLinphoneCoreUpdate;
+extern NSString *const kLinphoneDisplayStatusUpdate;
+extern NSString *const kLinphoneMessageReceived;
+extern NSString *const kLinphoneTextComposeEvent;
+extern NSString *const kLinphoneCallUpdate;
+extern NSString *const kLinphoneRegistrationUpdate;
+extern NSString *const kLinphoneMainViewChange;
+extern NSString *const kLinphoneAddressBookUpdate;
+extern NSString *const kLinphoneLogsUpdate;
+extern NSString *const kLinphoneSettingsUpdate;
+extern NSString *const kLinphoneBluetoothAvailabilityUpdate;
+extern NSString *const kLinphoneConfiguringStateUpdate;
+extern NSString *const kLinphoneGlobalStateUpdate;
+extern NSString *const kLinphoneNotifyReceived;
+extern NSString *const kLinphoneNotifyPresenceReceivedForUriOrTel;
+extern NSString *const kLinphoneCallEncryptionChanged;
+extern NSString *const kLinphoneFileTransferSendUpdate;
+extern NSString *const kLinphoneFileTransferRecvUpdate;
+extern NSString *const kLinphoneQRCodeFound;
+extern NSString *const kLinphoneChatCreateViewChange;
+
+typedef enum _NetworkType {
+    network_none = 0,
+    network_2g,
+    network_3g,
+    network_4g,
+    network_lte,
+    network_wifi
+} NetworkType;
+
+extern const int kLinphoneAudioVbrCodecDefaultBitrate;
+
+/* Application specific call context */
+typedef struct _CallContext {
+    LinphoneCall* call;
+    bool_t cameraIsEnabled;
+} CallContext;
+
+@interface LinphoneCallAppData :NSObject {
+    @public
+	bool_t batteryWarningShown;
+    UILocalNotification *notification;
+    NSMutableDictionary *userInfos;
+	bool_t videoRequested; /*set when user has requested for video*/
+    NSTimer* timer;
+};
+@end
+
+typedef struct _LinphoneManagerSounds {
+    SystemSoundID vibrate;
+} LinphoneManagerSounds;
+
+@interface HDLLinphoneManager : NSObject {
+@protected
+	SCNetworkReachabilityRef proxyReachability;
+
+@private
+	NSTimer* mIterateTimer;
+        NSMutableArray*  pushCallIDs;
+
+	UIBackgroundTaskIdentifier pausedCallBgTask;
+	UIBackgroundTaskIdentifier incallBgTask;
+	UIBackgroundTaskIdentifier pushBgTaskRefer;
+	UIBackgroundTaskIdentifier pushBgTaskCall;
+	UIBackgroundTaskIdentifier pushBgTaskMsg;
+	CTCallCenter* mCallCenter;
+    NSDate *mLastKeepAliveDate;
+@public
+    CallContext currentCallContextBeforeGoingBackground;
+}
++ (HDLLinphoneManager*)instance;
+#ifdef DEBUG
++ (void)instanceRelease;
+#endif
++ (LinphoneCore*) getLc;
++ (BOOL)runningOnIpad;
++ (BOOL)isNotIphone3G;
++ (NSString *)getPreferenceForCodec: (const char*) name withRate: (int) rate;
++ (BOOL)isCodecSupported: (const char*)codecName;
++ (NSSet *)unsupportedCodecs;
++ (NSString *)getUserAgent;
++ (int)unreadMessageCount;
+
+- (void)playMessageSound;
+- (void)resetLinphoneCore;
+- (void)startLinphoneCore;
+- (void)destroyLinphoneCore;
+- (BOOL)resignActive;
+- (void)becomeActive;
+- (BOOL)enterBackgroundMode;
+- (void)addPushCallId:(NSString*) callid;
+- (void)configurePushTokenForProxyConfig: (LinphoneProxyConfig*)cfg;
+- (BOOL)popPushCallID:(NSString*) callId;
+- (void)acceptCallForCallId:(NSString*)callid;
+- (LinphoneCall *)callByCallId:(NSString *)call_id;
+- (void)cancelLocalNotifTimerForCallId:(NSString*)callid;
+- (void)alertLIME:(LinphoneChatRoom *)room;
+- (void)startPushLongRunningTask:(NSString *)loc_key callId:(NSString *)callId;
++ (BOOL)langageDirectionIsRTL;
+
+- (void)refreshRegisters;
+
+- (bool)allowSpeaker;
+
+- (void)configureVbrCodecs;
+
++ (BOOL)copyFile:(NSString*)src destination:(NSString*)dst override:(BOOL)override ignore:(BOOL)ignore;
++ (PHFetchResult *)getPHAssets:(NSString *)key;
++ (NSString*)bundleFile:(NSString*)file;
++ (NSString *)preferenceFile:(NSString *)file;
++ (NSString *)documentFile:(NSString *)file;
++ (NSString*)dataFile:(NSString*)file;
++ (NSString*)cacheDirectory;
+
+- (void)acceptCall:(LinphoneCall *)call evenWithVideo:(BOOL)video;
+- (void)send:(NSString *)replyText toChatRoom:(LinphoneChatRoom *)room;
+- (void)call:(const LinphoneAddress *)address;
+- (BOOL)doCall:(const LinphoneAddress *)iaddr;
+- (BOOL)doCallWithSas:(const LinphoneAddress *)iaddr isSas:(BOOL)isSas;
+
++(id)getMessageAppDataForKey:(NSString*)key inMessage:(LinphoneChatMessage*)msg;
++(void)setValueInMessageAppData:(id)value forKey:(NSString*)key inMessage:(LinphoneChatMessage*)msg;
+
+- (void)lpConfigSetString:(NSString*)value forKey:(NSString*)key;
+- (void)lpConfigSetString:(NSString *)value forKey:(NSString *)key inSection:(NSString *)section;
+- (NSString *)lpConfigStringForKey:(NSString *)key;
+- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section;
+- (NSString *)lpConfigStringForKey:(NSString *)key withDefault:(NSString *)value;
+- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section withDefault:(NSString *)value;
+
+- (void)lpConfigSetInt:(int)value forKey:(NSString *)key;
+- (void)lpConfigSetInt:(int)value forKey:(NSString *)key inSection:(NSString *)section;
+- (int)lpConfigIntForKey:(NSString *)key;
+- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section;
+- (int)lpConfigIntForKey:(NSString *)key withDefault:(int)value;
+- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section withDefault:(int)value;
+
+- (void)lpConfigSetBool:(BOOL)value forKey:(NSString*)key;
+- (void)lpConfigSetBool:(BOOL)value forKey:(NSString *)key inSection:(NSString *)section;
+- (BOOL)lpConfigBoolForKey:(NSString *)key;
+- (BOOL)lpConfigBoolForKey:(NSString *)key inSection:(NSString *)section;
+- (BOOL)lpConfigBoolForKey:(NSString *)key withDefault:(BOOL)value;
+- (BOOL)lpConfigBoolForKey:(NSString *)key inSection:(NSString *)section withDefault:(BOOL)value;
+
+- (void)silentPushFailed:(NSTimer*)timer;
+
+- (void)removeAllAccounts;
+
++ (BOOL)isMyself:(const LinphoneAddress *)addr;
+
+- (void)shouldPresentLinkPopup;
+
+- (void)setProviderDelegate:(HDLLinphoneProviderDelegate *)del;
+
+//- (void) setLinphoneManagerAddressBookMap:(OrderedDictionary*) addressBook;
+//- (OrderedDictionary*) getLinphoneManagerAddressBookMap;
+
+- (void) setContactsUpdated:(BOOL) updated;
+- (BOOL) getContactsUpdated;
+
+- (void)checkNewVersion;
+
+- (void)loadAvatar;
+- (void)migrationPerAccount;
+
+- (void)login:(NSString*)username password:(NSString*)pwd domain:(NSString*) domain;
+
+-(void)initalLinPhonal;
+
+-(void)endCall;
+
+-(void)acceptCall;
+
+-(void)startCall:(NSString *)phoneNum;
+
+-(void)snapShotWithView:(UIView *)view;
+
+-(void)enableMicro:(BOOL)enble;
+
+@property HDLLinphoneProviderDelegate *providerDelegate;
+
+@property (readonly) BOOL isTesting;
+//@property(readonly, strong) FastAddressBook *fastAddressBook;
+@property (readonly) NetworkType network;
+@property (readonly) const char*  frontCamId;
+@property (readonly) const char*  backCamId;
+@property(strong, nonatomic) NSString *SSID;
+@property (readonly) sqlite3* database;
+@property(nonatomic, strong) NSData *pushNotificationToken;
+@property (readonly) LinphoneManagerSounds sounds;
+@property (readonly) NSMutableArray *logs;
+@property (nonatomic, assign) BOOL speakerBeforePause;
+@property (nonatomic, assign) BOOL speakerEnabled;
+@property (nonatomic, assign) BOOL bluetoothAvailable;
+@property (nonatomic, assign) BOOL bluetoothEnabled;
+@property (readonly) NSString* contactSipField;
+@property (readonly,copy) NSString* contactFilter;
+@property (copy) void (^silentPushCompletion)(UIBackgroundFetchResult);
+@property (readonly) BOOL wasRemoteProvisioned;
+@property (readonly) LpConfig *configDb;
+//@property(readonly) InAppProductsManager *iapManager;
+@property(strong, nonatomic) NSMutableArray *fileTransferDelegates;
+@property BOOL nextCallIsTransfer;
+@property BOOL conf;
+@property NSDictionary *pushDict;
+//@property(strong, nonatomic) OrderedDictionary *linphoneManagerAddressBookMap;
+@property (nonatomic, assign) BOOL contactsUpdated;
+@property UIImage *avatar;
+
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneManager.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneManager.m"
new file mode 100644
index 0000000..3826803
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneManager.m"
@@ -0,0 +1,3373 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <sys/sysctl.h>
+
+#import <AVFoundation/AVAudioSession.h>
+#import <AVFoundation/AVCaptureDevice.h>
+#import <AudioToolbox/AudioToolbox.h>
+#import <CoreTelephony/CTCallCenter.h>
+#import <CoreTelephony/CTTelephonyNetworkInfo.h>
+#import <SystemConfiguration/CaptiveNetwork.h>
+#import <SystemConfiguration/SystemConfiguration.h>
+
+//#import "LinphoneCoreSettingsStore.h"
+#import "LinphoneAppDelegate.h"
+#import "HDLLinphoneManager.h"
+#import "HDLLinphoneAudioHelper.h"
+//#import "Utils/FileTransferDelegate.h"
+
+#include "linphone/factory.h"
+#include "linphone/linphonecore_utils.h"
+#include "linphone/lpconfig.h"
+#include "mediastreamer2/mscommon.h"
+
+#import "HDLLinPhoneCommon.h"
+//#import "LinphoneIOSVersion.h"
+
+#import <AVFoundation/AVAudioPlayer.h>
+//#import "Utils.h"
+//#import "PhoneMainView.h"
+//#import "ChatsListView.h"
+//#import "ChatConversationView.h"
+#import <UserNotifications/UserNotifications.h>
+#import "HDLLinPhoneSDK.h"
+//#import "configManager.h"
+
+#import "HDLLinphoneLog.h"
+
+#define LINPHONE_LOGS_MAX_ENTRY 5000
+
+#define LINPHONE_IOS_VERSION "6c34346"
+
+#define LC ([HDLLinphoneManager getLc])
+
+#define LINPHONE_DUMMY_SUBJECT "dummy subject"
+
+#define LINPHONE_SDK_VERSION @"4.3.0"
+
+#define kIAPReady @"IAPReady"                          // no data
+
+#define IPAD (HDLLinphoneManager.runningOnIpad)
+
+static LinphoneCore *theLinphoneCore = nil;
+static HDLLinphoneManager *theLinphoneManager = nil;
+
+NSString *const LINPHONERC_APPLICATION_KEY = @"app";
+
+NSString *const kLinphoneCoreUpdate = @"LinphoneCoreUpdate";
+NSString *const kLinphoneDisplayStatusUpdate = @"LinphoneDisplayStatusUpdate";
+NSString *const kLinphoneMessageReceived = @"LinphoneMessageReceived";
+NSString *const kLinphoneTextComposeEvent = @"LinphoneTextComposeStarted";
+NSString *const kLinphoneCallUpdate = @"LinphoneCallUpdate";
+NSString *const kLinphoneRegistrationUpdate = @"LinphoneRegistrationUpdate";
+NSString *const kLinphoneAddressBookUpdate = @"LinphoneAddressBookUpdate";
+NSString *const kLinphoneMainViewChange = @"LinphoneMainViewChange";
+NSString *const kLinphoneLogsUpdate = @"LinphoneLogsUpdate";
+NSString *const kLinphoneSettingsUpdate = @"LinphoneSettingsUpdate";
+NSString *const kLinphoneBluetoothAvailabilityUpdate = @"LinphoneBluetoothAvailabilityUpdate";
+NSString *const kLinphoneConfiguringStateUpdate = @"LinphoneConfiguringStateUpdate";
+NSString *const kLinphoneGlobalStateUpdate = @"LinphoneGlobalStateUpdate";
+NSString *const kLinphoneNotifyReceived = @"LinphoneNotifyReceived";
+NSString *const kLinphoneNotifyPresenceReceivedForUriOrTel = @"LinphoneNotifyPresenceReceivedForUriOrTel";
+NSString *const kLinphoneCallEncryptionChanged = @"LinphoneCallEncryptionChanged";
+NSString *const kLinphoneFileTransferSendUpdate = @"LinphoneFileTransferSendUpdate";
+NSString *const kLinphoneFileTransferRecvUpdate = @"LinphoneFileTransferRecvUpdate";
+NSString *const kLinphoneQRCodeFound = @"LinphoneQRCodeFound";
+NSString *const kLinphoneChatCreateViewChange = @"LinphoneChatCreateViewChange";
+
+const int kLinphoneAudioVbrCodecDefaultBitrate = 36; /*you can override this from linphonerc or linphonerc-factory*/
+
+extern void libmsamr_init(MSFactory *factory);
+extern void libmsx264_init(MSFactory *factory);
+extern void libmsopenh264_init(MSFactory *factory);
+extern void libmssilk_init(MSFactory *factory);
+extern void libmswebrtc_init(MSFactory *factory);
+extern void libmscodec2_init(MSFactory *factory);
+
+#define FRONT_CAM_NAME							\
+	"AV Capture: com.apple.avfoundation.avcapturedevice.built-in_video:1" /*"AV Capture: Front Camera"*/
+#define BACK_CAM_NAME							\
+	"AV Capture: com.apple.avfoundation.avcapturedevice.built-in_video:0" /*"AV Capture: Back Camera"*/
+
+NSString *const kLinphoneOldChatDBFilename = @"chat_database.sqlite";
+NSString *const kLinphoneInternalChatDBFilename = @"linphone_chats.db";
+
+@implementation LinphoneCallAppData
+- (id)init {
+	if ((self = [super init])) {
+		batteryWarningShown = FALSE;
+		notification = nil;
+		videoRequested = FALSE;
+		userInfos = [[NSMutableDictionary alloc] init];
+	}
+	return self;
+}
+
+@end
+
+@interface HDLLinphoneManager (){
+    LinphoneAccountCreator *account_creator;
+}
+	@property(strong, nonatomic) AVAudioPlayer *messagePlayer;
+@end
+
+@implementation HDLLinphoneManager
+
+struct codec_name_pref_table {
+	const char *name;
+	int rate;
+	const char *prefname;
+};
+
+struct codec_name_pref_table codec_pref_table[] = {{"speex", 8000, "speex_8k_preference"},
+						   {"speex", 16000, "speex_16k_preference"},
+						   {"silk", 24000, "silk_24k_preference"},
+						   {"silk", 16000, "silk_16k_preference"},
+						   {"amr", 8000, "amr_preference"},
+						   {"gsm", 8000, "gsm_preference"},
+						   {"ilbc", 8000, "ilbc_preference"},
+						   {"isac", 16000, "isac_preference"},
+						   {"pcmu", 8000, "pcmu_preference"},
+						   {"pcma", 8000, "pcma_preference"},
+						   {"g722", 8000, "g722_preference"},
+						   {"g729", 8000, "g729_preference"},
+						   {"mp4v-es", 90000, "mp4v-es_preference"},
+						   {"h264", 90000, "h264_preference"},
+						   {"h265", 90000, "h265_preference"},
+						   {"vp8", 90000, "vp8_preference"},
+						   {"mpeg4-generic", 16000, "aaceld_16k_preference"},
+						   {"mpeg4-generic", 22050, "aaceld_22k_preference"},
+						   {"mpeg4-generic", 32000, "aaceld_32k_preference"},
+						   {"mpeg4-generic", 44100, "aaceld_44k_preference"},
+						   {"mpeg4-generic", 48000, "aaceld_48k_preference"},
+						   {"opus", 48000, "opus_preference"},
+						   {"BV16", 8000, "bv16_preference"},
+						   {"CODEC2", 8000, "codec2_preference"},
+						   {NULL, 0, Nil}};
+
++ (NSString *)getPreferenceForCodec:(const char *)name withRate:(int)rate {
+	int i;
+	for (i = 0; codec_pref_table[i].name != NULL; ++i) {
+		if (strcasecmp(codec_pref_table[i].name, name) == 0 && codec_pref_table[i].rate == rate)
+			return [NSString stringWithUTF8String:codec_pref_table[i].prefname];
+	}
+	return Nil;
+}
+
++ (NSSet *)unsupportedCodecs {
+	NSMutableSet *set = [NSMutableSet set];
+	for (int i = 0; codec_pref_table[i].name != NULL; ++i) {
+		PayloadType *available = linphone_core_find_payload_type(
+									 theLinphoneCore, codec_pref_table[i].name, codec_pref_table[i].rate, LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS);
+		if ((available == NULL)
+		    // these two codecs should not be hidden, even if not supported
+		    && strcmp(codec_pref_table[i].prefname, "h264_preference") != 0 &&
+		    strcmp(codec_pref_table[i].prefname, "mp4v-es_preference") != 0) {
+			[set addObject:[NSString stringWithUTF8String:codec_pref_table[i].prefname]];
+		}
+	}
+	return set;
+}
+
++ (BOOL)isCodecSupported:(const char *)codecName {
+	return (codecName != NULL) &&
+		(NULL != linphone_core_find_payload_type(theLinphoneCore, codecName, LINPHONE_FIND_PAYLOAD_IGNORE_RATE,
+							 LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS));
+}
+
++ (BOOL)runningOnIpad {
+	return ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad);
+}
+
++ (BOOL)isRunningTests {
+	NSDictionary *environment = [[NSProcessInfo processInfo] environment];
+	NSString *injectBundle = environment[@"XCInjectBundle"];
+	return [[injectBundle pathExtension] isEqualToString:@"xctest"];
+}
+
++ (BOOL)isNotIphone3G {
+	static BOOL done = FALSE;
+	static BOOL result;
+	if (!done) {
+		size_t size;
+		sysctlbyname("hw.machine", NULL, &size, NULL, 0);
+		char *machine = malloc(size);
+		sysctlbyname("hw.machine", machine, &size, NULL, 0);
+		NSString *platform = [[NSString alloc] initWithUTF8String:machine];
+		free(machine);
+
+		result = ![platform isEqualToString:@"iPhone1,2"];
+
+		done = TRUE;
+	}
+	return result;
+}
+
++ (NSString *)getUserAgent {
+	return
+		[NSString stringWithFormat:@"LinphoneIphone/%@ (Linphone/%s; Apple %@/%@)",
+		 [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey],
+		 linphone_core_get_version(), [UIDevice currentDevice].systemName,
+		 [UIDevice currentDevice].systemVersion];
+}
+
++ (HDLLinphoneManager *)instance {
+	@synchronized(self) {
+		if (theLinphoneManager == nil) {
+			theLinphoneManager = [[HDLLinphoneManager alloc] init];
+            theLinphoneManager.providerDelegate=[[HDLLinphoneProviderDelegate alloc]init];
+		}
+	}
+	return theLinphoneManager;
+}
+
+#ifdef DEBUG
++ (void)instanceRelease {
+	if (theLinphoneManager != nil) {
+		theLinphoneManager = nil;
+        
+	}
+}
+#endif
+
++ (BOOL)langageDirectionIsRTL {
+	static NSLocaleLanguageDirection dir = NSLocaleLanguageDirectionLeftToRight;
+	static dispatch_once_t onceToken;
+	dispatch_once(&onceToken, ^{
+			dir = [NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]];
+		});
+	return dir == NSLocaleLanguageDirectionRightToLeft;
+}
+
+#pragma mark - Lifecycle Functions
+
+- (id)init {
+	if ((self = [super init])) {
+		[NSNotificationCenter.defaultCenter addObserver:self
+		 selector:@selector(audioRouteChangeListenerCallback:)
+		 name:AVAudioSessionRouteChangeNotification
+		 object:nil];
+
+		NSString *path = [[NSBundle mainBundle] pathForResource:@"msg" ofType:@"wav"];
+		self.messagePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL URLWithString:path] error:nil];
+
+		_sounds.vibrate = kSystemSoundID_Vibrate;
+
+		_logs = [[NSMutableArray alloc] init];
+		_pushDict = [[NSMutableDictionary alloc] init];
+		_database = NULL;
+		_speakerEnabled = FALSE;
+		_speakerBeforePause = FALSE;
+		_bluetoothEnabled = FALSE;
+		_conf = FALSE;
+		_fileTransferDelegates = [[NSMutableArray alloc] init];
+//		_linphoneManagerAddressBookMap = [[OrderedDictionary alloc] init];
+		pushCallIDs = [[NSMutableArray alloc] init];
+		_isTesting = [HDLLinphoneManager isRunningTests];
+		[self migrateImportantFiles];
+		[self renameDefaultSettings];
+		[self copyDefaultSettings];
+		[self overrideDefaultSettings];
+
+		// set default values for first boot
+		if ([self lpConfigStringForKey:@"debugenable_preference"] == nil) {
+#ifdef DEBUG
+			[self lpConfigSetInt:1 forKey:@"debugenable_preference"];
+#else
+			[self lpConfigSetInt:0 forKey:@"debugenable_preference"];
+#endif
+		}
+
+		// by default if handle_content_encoding is not set, we use plain text for debug purposes only
+		if ([self lpConfigStringForKey:@"handle_content_encoding" inSection:@"misc"] == nil) {
+#ifdef DEBUG
+			[self lpConfigSetString:@"none" forKey:@"handle_content_encoding" inSection:@"misc"];
+#else
+			[self lpConfigSetString:@"conflate" forKey:@"handle_content_encoding" inSection:@"misc"];
+#endif
+		}
+
+		[self migrateFromUserPrefs];
+		[self loadAvatar];
+	}
+	return self;
+}
+
+- (void)dealloc {
+	[NSNotificationCenter.defaultCenter removeObserver:self];
+}
+
+#pragma mark - AddressBookMap
+
+//- (void) setLinphoneManagerAddressBookMap:(OrderedDictionary*) addressBook{
+////	_linphoneManagerAddressBookMap = addressBook;
+//}
+
+//- (OrderedDictionary*) getLinphoneManagerAddressBookMap{
+//	return _linphoneManagerAddressBookMap;
+//}
+
+- (void) setContactsUpdated:(BOOL) updated{
+	_contactsUpdated = updated;
+}
+- (BOOL) getContactsUpdated{
+	return _contactsUpdated;
+}
+
+#pragma deploymate push "ignored-api-availability"
+- (void)silentPushFailed:(NSTimer *)timer {
+	if (_silentPushCompletion) {
+//		LOGI(@"silentPush failed, silentPushCompletion block: %p", _silentPushCompletion);
+		_silentPushCompletion(UIBackgroundFetchResultNoData);
+		_silentPushCompletion = nil;
+	}
+}
+#pragma deploymate pop
+
+#pragma mark - Migration
+
+- (void)migrationAllPost {
+	[self migrationLinphoneSettings];
+	[self migrationPerAccount];
+}
+
+- (void)migrationAllPre {
+	// migrate xmlrpc URL if needed
+	if ([self lpConfigBoolForKey:@"migration_xmlrpc"] == NO) {
+		[self lpConfigSetString:@"https://subscribe.linphone.org:444/wizard.php"
+		 forKey:@"xmlrpc_url"
+		 inSection:@"assistant"];
+		[self lpConfigSetString:@"sip:rls@sip.linphone.org" forKey:@"rls_uri" inSection:@"sip"];
+		[self lpConfigSetBool:YES forKey:@"migration_xmlrpc"];
+	}
+	[self lpConfigSetBool:NO forKey:@"store_friends" inSection:@"misc"]; //so far, storing friends in files is not needed. may change in the future.
+    
+}
+
+static int check_should_migrate_images(void *data, int argc, char **argv, char **cnames) {
+	*((BOOL *)data) = TRUE;
+	return 0;
+}
+
+- (void)migrateFromUserPrefs {
+	static NSString *migration_flag = @"userpref_migration_done";
+
+	if (_configDb == nil)
+		return;
+
+	if ([self lpConfigIntForKey:migration_flag withDefault:0]) {
+		return;
+	}
+
+	NSDictionary *defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
+	NSArray *defaults_keys = [defaults allKeys];
+	NSDictionary *values =
+		@{ @"backgroundmode_preference" : @NO,
+		   @"debugenable_preference" : @NO,
+		   @"start_at_boot_preference" : @YES };
+	BOOL shouldSync = FALSE;
+
+//	LOGI(@"%lu user prefs", (unsigned long)[defaults_keys count]);
+
+	for (NSString *userpref in values) {
+		if ([defaults_keys containsObject:userpref]) {
+//			LOGI(@"Migrating %@ from user preferences: %d", userpref, [[defaults objectForKey:userpref] boolValue]);
+			[self lpConfigSetBool:[[defaults objectForKey:userpref] boolValue] forKey:userpref];
+			[[NSUserDefaults standardUserDefaults] removeObjectForKey:userpref];
+			shouldSync = TRUE;
+		} else if ([self lpConfigStringForKey:userpref] == nil) {
+			// no default value found in our linphonerc, we need to add them
+			[self lpConfigSetBool:[[values objectForKey:userpref] boolValue] forKey:userpref];
+		}
+	}
+
+	if (shouldSync) {
+//		LOGI(@"Synchronizing...");
+		[[NSUserDefaults standardUserDefaults] synchronize];
+	}
+	// don't get back here in the future
+	[self lpConfigSetBool:YES forKey:migration_flag];
+}
+
+- (void)migrationLinphoneSettings {
+	/* AVPF migration */
+	if ([self lpConfigBoolForKey:@"avpf_migration_done"] == FALSE) {
+		const MSList *proxies = linphone_core_get_proxy_config_list(theLinphoneCore);
+		while (proxies) {
+			LinphoneProxyConfig *proxy = (LinphoneProxyConfig *)proxies->data;
+			const char *addr = linphone_proxy_config_get_addr(proxy);
+			// we want to enable AVPF for the proxies
+			if (addr &&
+			    strstr(addr, [HDLLinphoneManager.instance lpConfigStringForKey:@"domain_name"
+					  inSection:@"app"
+					  withDefault:@"sip.linphone.org"]
+				   .UTF8String) != 0) {
+//				LOGI(@"Migrating proxy config to use AVPF");
+				linphone_proxy_config_enable_avpf(proxy, TRUE);
+			}
+			proxies = proxies->next;
+		}
+		[self lpConfigSetBool:TRUE forKey:@"avpf_migration_done"];
+	}
+	/* Quality Reporting migration */
+	if ([self lpConfigBoolForKey:@"quality_report_migration_done"] == FALSE) {
+		const MSList *proxies = linphone_core_get_proxy_config_list(theLinphoneCore);
+		while (proxies) {
+			LinphoneProxyConfig *proxy = (LinphoneProxyConfig *)proxies->data;
+			const char *addr = linphone_proxy_config_get_addr(proxy);
+			// we want to enable quality reporting for the proxies that are on linphone.org
+			if (addr &&
+			    strstr(addr, [HDLLinphoneManager.instance lpConfigStringForKey:@"domain_name"
+					  inSection:@"app"
+					  withDefault:@"sip.linphone.org"]
+				   .UTF8String) != 0) {
+//				LOGI(@"Migrating proxy config to send quality report");
+				linphone_proxy_config_set_quality_reporting_collector(
+										      proxy, "sip:voip-metrics@sip.linphone.org;transport=tls");
+				linphone_proxy_config_set_quality_reporting_interval(proxy, 180);
+				linphone_proxy_config_enable_quality_reporting(proxy, TRUE);
+			}
+			proxies = proxies->next;
+		}
+		[self lpConfigSetBool:TRUE forKey:@"quality_report_migration_done"];
+	}
+	/* File transfer migration */
+	if ([self lpConfigBoolForKey:@"file_transfer_migration_done"] == FALSE) {
+		const char *newURL = "https://www.linphone.org:444/lft.php";
+//		LOGI(@"Migrating sharing server url from %s to %s", linphone_core_get_file_transfer_server(LC), newURL);
+//		linphone_core_set_file_transfer_server(LC, newURL);
+		[self lpConfigSetBool:TRUE forKey:@"file_transfer_migration_done"];
+	}
+	
+	if ([self lpConfigBoolForKey:@"lime_migration_done"] == FALSE) {
+		const MSList *proxies = linphone_core_get_proxy_config_list(LC);
+		while (proxies) {
+			if (!strcmp(linphone_proxy_config_get_domain((LinphoneProxyConfig *)proxies->data),"sip.linphone.org")) {
+				linphone_core_set_lime_x3dh_server_url(LC, "https://lime.linphone.org/lime-server/lime-server.php");
+				break;
+			}
+			proxies = proxies->next;
+		}
+		[self lpConfigSetBool:TRUE forKey:@"lime_migration_done"];
+	}
+}
+
+- (void)migrationPerAccount {
+	const bctbx_list_t * proxies = linphone_core_get_proxy_config_list(LC);
+	NSString *appDomain  = [HDLLinphoneManager.instance lpConfigStringForKey:@"domain_name"
+				inSection:@"app"
+				withDefault:@"sip.linphone.org"];
+	while (proxies) {
+		LinphoneProxyConfig *config = proxies->data;
+		// can not create group chat without conference factory
+		if (!linphone_proxy_config_get_conference_factory_uri(config)) {
+			if (strcmp(appDomain.UTF8String, linphone_proxy_config_get_domain(config)) == 0) {
+				linphone_proxy_config_set_conference_factory_uri(config, "sip:conference-factory@sip.linphone.org");
+			}
+		}
+		proxies = proxies->next;
+	}
+	
+	NSString *s = [self lpConfigStringForKey:@"pushnotification_preference"];
+	if (s && s.boolValue) {
+//		LOGI(@"Migrating push notification per account, enabling for ALL");
+		[self lpConfigSetBool:NO forKey:@"pushnotification_preference"];
+		const MSList *proxies = linphone_core_get_proxy_config_list(LC);
+		while (proxies) {
+			linphone_proxy_config_set_ref_key(proxies->data, "push_notification");
+			[self configurePushTokenForProxyConfig:proxies->data];
+			proxies = proxies->next;
+		}
+	}
+}
+
+- (void)launchLinphoneCore {
+    
+    if (libStarted) {
+        return;
+    }
+    
+    libStarted = TRUE;
+    
+    signal(SIGPIPE, SIG_IGN);
+    
+    // create linphone core
+    [self createLinphoneCore];
+    
+    
+    
+    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
+    BOOL bAudioInputAvailable = audioSession.inputAvailable;
+    NSError *err = nil;
+    
+    if (![audioSession setActive:NO error:&err] && err) {
+        
+        err = nil;
+    }
+    if (!bAudioInputAvailable) {
+        
+    }
+}
+
+-(void)initalLinPhonal{
+    [HDLLinphoneManager.instance startLinphoneCore];
+    // Override point for customization after application launch.
+//    UIApplication *app = [UIApplication sharedApplication];
+//    if (!account_creator) {
+//        account_creator = linphone_account_creator_new(
+//                                                       [HDLLinphoneManager getLc],
+//                                                       [configManager.instance lpConfigStringForKey:@"xmlrpc_url"  section:@"assistant" defaultValue:@""]
+//                                                       .UTF8String);
+//    }
+    
+    [self loadAssistantConfig:@"assistant_external_sip.rc"];
+    
+}
+
+- (void)loadAssistantConfig:(NSString *)rcFilename {
+    linphone_core_load_config_from_xml( [HDLLinphoneManager getLc],
+                                       [HDLLinphoneManager bundleFile:rcFilename].UTF8String);
+   
+//    if (account_creator) {
+//        linphone_account_creator_set_domain(account_creator, [ [configManager.instance lpConfigStringForKey:@"domain" section:@"assistant" defaultValue:@""] UTF8String]);
+//
+//
+//        linphone_account_creator_set_algorithm(account_creator, [[configManager.instance lpConfigStringForKey:@"algorithm" section:@"assistant" defaultValue:@""] UTF8String]);
+//    }
+    MSVideoSize vsize;
+    MS_VIDEO_SIZE_ASSIGN(vsize, QVGA);
+    linphone_core_set_preferred_video_size([HDLLinphoneManager getLc], vsize);
+    linphone_core_set_video_preset([HDLLinphoneManager getLc], [@"custom" UTF8String]);
+    linphone_core_set_preferred_framerate([HDLLinphoneManager getLc], 5);
+
+
+}
+
+-(void)endCall{
+    LinphoneCall *currentcall = linphone_core_get_current_call(theLinphoneCore);
+
+    if (linphone_core_is_in_conference(theLinphoneCore) ||                                           // In conference
+        
+        (linphone_core_get_conference_size(theLinphoneCore) > 0 ) // Only one conf
+        ) {
+//        NSLog(@"鏄細璁�");
+        linphone_core_terminate_conference(theLinphoneCore);
+    } else if (currentcall != NULL) {
+        linphone_call_terminate(currentcall);
+        
+    } else {
+//        NSLog(@"鍏跺畠鎯呭喌");
+        const MSList *calls = linphone_core_get_calls(theLinphoneCore);
+        if (bctbx_list_size(calls) == 1) { // Only one call
+            linphone_call_terminate((LinphoneCall *)(calls->data));
+        }
+    }
+}
+
+-(void)acceptCall{
+    LinphoneCall * call = linphone_core_get_current_call(theLinphoneCore);
+    LinphoneCallParams *lcallParams = linphone_core_create_call_params(theLinphoneCore, call);
+    if (!lcallParams) {
+        NSLog(@"Could not create call parameters for %p, call has probably already ended.", call);
+        return;
+    }
+
+    if ([self lpConfigBoolForKey:@"edge_opt_preference"]) {
+        bool low_bandwidth = self.network == network_2g;
+        if (low_bandwidth) {
+//            LOGI(@"Low bandwidth mode");
+        }
+        linphone_call_params_enable_low_bandwidth(lcallParams, low_bandwidth);
+    }
+    linphone_call_params_enable_video(lcallParams, TRUE);
+
+    //We set the record file name here because we can't do it after the call is started.
+//    NSString *writablePath = [LinphoneUtils recordingFilePathFromCall:linphone_call_log_get_from_address(linphone_call_get_call_log(call))];
+//    LOGD(@"record file path: %@\n", writablePath);
+//
+//    linphone_call_params_set_record_file(lcallParams, [writablePath cStringUsingEncoding:NSUTF8StringEncoding]);
+    
+    linphone_call_accept_with_params(call, lcallParams);
+    linphone_call_params_unref(lcallParams);
+}
+
+-(void)startCall:(NSString *)phoneNum{
+    LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(theLinphoneCore);
+    const char *normvalue;
+    normvalue = linphone_proxy_config_is_phone_number(cfg, phoneNum.UTF8String)
+    ? linphone_proxy_config_normalize_phone_number(cfg, phoneNum.UTF8String)
+    : phoneNum.UTF8String;
+    
+    LinphoneAddress *addr = linphone_proxy_config_normalize_sip_uri(cfg, normvalue);
+    
+    // numbers by default
+    if (addr && cfg) {
+        const char *username = linphone_proxy_config_get_dial_escape_plus(cfg) ? normvalue : phoneNum.UTF8String;
+        if (linphone_proxy_config_is_phone_number(cfg, username))
+            linphone_address_set_username(addr, linphone_proxy_config_normalize_phone_number(cfg, username));
+    }
+    [self call:addr];
+    if (addr)
+        linphone_address_destroy(addr);
+}
+
+//-(LinphoneAddress *)normalizeSipOrPhoneAddress:(NSString *)value {
+//      if (!value || [value isEqualToString:@""])
+//        return NULL;
+//
+//      LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC);
+//      const char *normvalue;
+//    normvalue = linphone_proxy_config_is_phone_number(cfg, value.UTF8String)
+//          ? linphone_proxy_config_normalize_phone_number(cfg, value.UTF8String)
+//        : value.UTF8String;
+//
+//      LinphoneAddress *addr = linphone_proxy_config_normalize_sip_uri(cfg, normvalue);
+//      // first try to find a friend with the given address
+//      Contact *c = [FastAddressBook getContactWithAddress:addr];
+//
+//      if (c && c.friend) {
+//        LinphoneFriend *f = c.friend;
+//        const LinphonePresenceModel *m = f
+//            ? linphone_friend_get_presence_model_for_uri_or_tel(f, value.UTF8String)
+//            : NULL;
+//        const char *contact = m ? linphone_presence_model_get_contact(m) : NULL;
+//        if (contact) {
+//              LinphoneAddress *contact_addr = linphone_address_new(contact);
+//              if (contact_addr) {
+//                linphone_address_destroy(addr);
+//                return contact_addr;
+//              }
+//        }
+//    }
+//
+//    // since user wants to escape plus, we assume it expects to have phone
+//    // numbers by default
+//    if (addr && cfg) {
+//        const char *username = linphone_proxy_config_get_dial_escape_plus(cfg) ? normvalue : value.UTF8String;
+//        if (linphone_proxy_config_is_phone_number(cfg, username))
+//            linphone_address_set_username(addr, linphone_proxy_config_normalize_phone_number(cfg, username));
+//     }
+//    return addr;
+//}
+
+-(void)snapShotWithView:(UIView *)view{
+    UIImage *image= [HDLLinPhoneCommon captureImageFromView:view];
+    [HDLLinPhoneCommon saveImageToPhotosAlbum:image];
+}
+
+-(void)enableMicro:(BOOL)enble{
+    linphone_core_enable_mic(LC, enble);
+//    linphone_core_enable_mic(LC, false);
+}
+
+- (void)login:(NSString*)username password:(NSString*)pwd domain:(NSString*) domain{
+//    NSString *domain = [self findTextField:ViewElement_Domain].text;
+//    NSString *username = username;
+    NSString *displayName = @"";
+//    NSString *pwd = [self findTextField:ViewElement_Password].text;
+    LinphoneProxyConfig *config = linphone_core_create_proxy_config(LC);
+    LinphoneAddress *addr = linphone_address_new(NULL);
+    LinphoneAddress *tmpAddr = linphone_address_new([NSString stringWithFormat:@"sip:%@",domain].UTF8String);
+    if (tmpAddr == nil) {
+//        [self displayAssistantConfigurationError];
+        return;
+    }
+    
+    linphone_address_set_username(addr, username.UTF8String);
+    linphone_address_set_port(addr, linphone_address_get_port(tmpAddr));
+    linphone_address_set_domain(addr, linphone_address_get_domain(tmpAddr));
+    if (displayName && ![displayName isEqualToString:@""]) {
+        linphone_address_set_display_name(addr, displayName.UTF8String);
+    }
+    linphone_proxy_config_set_identity_address(config, addr);
+
+    // set transport
+    NSString *type = @"UDP";
+    linphone_proxy_config_set_route(
+                                    config,
+                                    [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, type.lowercaseString.UTF8String]
+                                    .UTF8String);
+    linphone_proxy_config_set_server_addr(
+                                          config,
+                                          [NSString stringWithFormat:@"%s;transport=%s", domain.UTF8String, type.lowercaseString.UTF8String]
+                                          .UTF8String);
+
+    linphone_proxy_config_enable_publish(config, FALSE);
+    linphone_proxy_config_enable_register(config, TRUE);
+
+    LinphoneAuthInfo *info =
+        linphone_auth_info_new(linphone_address_get_username(addr), // username
+                               NULL,                                // user id
+                               pwd.UTF8String,                        // passwd
+                               NULL,                                // ha1
+                               linphone_address_get_domain(addr),   // realm - assumed to be domain
+                               linphone_address_get_domain(addr)    // domain
+                               );
+    linphone_core_add_auth_info(LC, info);
+    linphone_address_unref(addr);
+    linphone_address_unref(tmpAddr);
+
+    if (config) {
+        [[HDLLinphoneManager instance] configurePushTokenForProxyConfig:config];
+        if (linphone_core_add_proxy_config(LC, config) != -1) {
+            linphone_core_set_default_proxy_config(LC, config);
+            // reload address book to prepend proxy config domain to contacts' phone number
+            // todo: STOP doing that!
+//            [[LinphoneManager.instance fastAddressBook] fetchContactsInBackGroundThread];
+//            [PhoneMainView.instance changeCurrentView:DialerView.compositeViewDescription];
+            NSLog(@"鐧诲綍鎴愬姛浜嗭紵");
+        } else {
+//          [self displayAssistantConfigurationError];
+        }
+    } else {
+//      [self displayAssistantConfigurationError];
+    }
+}
+
+
+static void migrateWizardToAssistant(const char *entry, void *user_data) {
+	HDLLinphoneManager *thiz = (__bridge HDLLinphoneManager *)(user_data);
+	NSString *key = [NSString stringWithUTF8String:entry];
+	[thiz lpConfigSetString:[thiz lpConfigStringForKey:key inSection:@"wizard"] forKey:key inSection:@"assistant"];
+}
+
+#pragma mark - Linphone Core Functions
+
++ (LinphoneCore *)getLc {
+	if (theLinphoneCore == nil) {
+		@throw([NSException exceptionWithName:@"LinphoneCoreException"
+			reason:@"Linphone core not initialized yet"
+			userInfo:nil]);
+	}
+	return theLinphoneCore;
+}
+
+#pragma mark Debug functions
+
++ (void)dumpLcConfig {
+	if (theLinphoneCore) {
+		LpConfig *conf = HDLLinphoneManager.instance.configDb;
+		char *config = lp_config_dump(conf);
+//		LOGI(@"\n%s", config);
+		ms_free(config);
+	}
+}
+
+#pragma mark - Logs Functions handlers
+static void linphone_iphone_log_user_info(struct _LinphoneCore *lc, const char *message) {
+	linphone_iphone_log_handler(NULL, ORTP_MESSAGE, message, NULL);
+}
+static void linphone_iphone_log_user_warning(struct _LinphoneCore *lc, const char *message) {
+	linphone_iphone_log_handler(NULL, ORTP_WARNING, message, NULL);
+}
+
+#pragma mark - Display Status Functions
+
+- (void)displayStatus:(NSString *)message {
+	// Post event
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneDisplayStatusUpdate
+	 object:self
+	 userInfo:@{
+			@"message" : message
+				}];
+}
+
+static void linphone_iphone_display_status(struct _LinphoneCore *lc, const char *message) {
+	NSString *status = [[NSString alloc] initWithCString:message encoding:[NSString defaultCStringEncoding]];
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) displayStatus:status];
+}
+
+#pragma mark - Call State Functions
+
+- (void)localNotifContinue:(NSTimer *)timer {
+	UILocalNotification *notif = [timer userInfo];
+	if (notif) {
+//		LOGI(@"cancelling/presenting local notif");
+		[[UIApplication sharedApplication] cancelAllLocalNotifications];
+		[[UIApplication sharedApplication] presentLocalNotificationNow:notif];
+	}
+}
+
+- (void)userNotifContinue:(NSTimer *)timer {
+	UNNotificationContent *content = [timer userInfo];
+	if (content && [UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
+//		LOGI(@"cancelling/presenting user notif");
+		UNNotificationRequest *req =
+			[UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL];
+		[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:req
+		 withCompletionHandler:^(NSError *_Nullable error) {
+				// Enable or disable features based on authorization.
+				if (error) {
+//					LOGD(@"Error while adding notification request :");
+//					LOGD(error.description);
+				}
+			}];
+	}
+}
+
+
+- (void)onCall:(LinphoneCall *)call StateChanged:(LinphoneCallState)state withMessage:(const char *)message {
+    NSLog(@"鍛煎彨鐘舵�侊細%u",state);
+    
+    HDLLinPhoneSDK.instance.IsIncomingReceivedCallState=false;
+	// Handling wrapper
+	LinphoneCallAppData *data = (__bridge LinphoneCallAppData *)linphone_call_get_user_data(call);
+	if (!data) {
+		data = [[LinphoneCallAppData alloc] init];
+		linphone_call_set_user_data(call, (void *)CFBridgingRetain(data));
+	}
+
+#pragma deploymate push "ignored-api-availability"
+	if (_silentPushCompletion) {
+		// we were woken up by a silent push. Call the completion handler with NEWDATA
+		// so that the push is notified to the user
+//		LOGI(@"onCall - handler %p", _silentPushCompletion);
+		_silentPushCompletion(UIBackgroundFetchResultNewData);
+		_silentPushCompletion = nil;
+	}
+#pragma deploymate pop
+
+	const LinphoneAddress *addr = linphone_call_get_remote_address(call);
+//	NSString *address = [FastAddressBook displayNameForAddress:addr];
+    NSString *address=@"";
+	if (state == LinphoneCallIncomingReceived) {
+        HDLLinPhoneSDK.instance.IsIncomingReceivedCallState=true;
+        [HDLLinphoneManager.instance enableMicro:true];
+//		LinphoneCallLog *callLog = linphone_call_get_call_log(call);
+//		NSString *callId = [NSString stringWithUTF8String:linphone_call_log_get_call_id(callLog)];
+//		int index = [(NSNumber *)[_pushDict objectForKey:callId] intValue] - 1;
+//		NSLog(@"Decrementing index of long running task for call id : %@ with index : %d", callId, index);
+//		[_pushDict setValue:[NSNumber numberWithInt:index] forKey:callId];
+//		BOOL need_bg_task = FALSE;
+//        NSLog(@"_pushDict:%@",_pushDict);
+//		for (NSString *key in [_pushDict allKeys]) {
+//			int value = [(NSNumber *)[_pushDict objectForKey:key] intValue];
+//			if (value > 0) {
+//				need_bg_task = TRUE;
+//				break;
+//			}
+//		}
+//		if (pushBgTaskCall && !need_bg_task) {
+//            NSLog(@"Call received, stopping call background task for call-id [%@]", callId);
+//			[[UIApplication sharedApplication] endBackgroundTask:pushBgTaskCall];
+//			pushBgTaskCall = 0;
+//		}
+//		/*first step is to re-enable ctcall center*/
+//		CTCallCenter *lCTCallCenter = [[CTCallCenter alloc] init];
+//
+//		/*should we reject this call ?*/
+//		if ([lCTCallCenter currentCalls] != nil &&
+//		    floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+//			char *tmp = linphone_call_get_remote_address_as_string(call);
+//			if (tmp) {
+//				LOGI(@"Mobile call ongoing... rejecting call from [%s]", tmp);
+//				ms_free(tmp);
+//			}
+//			linphone_call_decline(call, LinphoneReasonBusy);
+//			return;
+//		}
+//
+//		if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
+//			if (call && (linphone_core_get_calls_nb(LC) < 2)) {
+//				if ([HDLLinphoneManager.instance lpConfigBoolForKey:@"accept_early_media" inSection:@"app"] && [HDLLinphoneManager.instance lpConfigBoolForKey:@"pref_accept_early_media"]) {
+////					[PhoneMainView.instance displayIncomingCall:call];
+//				} else {
+//#if !TARGET_IPHONE_SIMULATOR
+//			NSString *callId = [NSString stringWithUTF8String:linphone_call_log_get_call_id(linphone_call_get_call_log(call))];
+//			NSUUID *uuid = [NSUUID UUID];
+//			[HDLLinphoneManager.instance.providerDelegate.calls setObject:callId forKey:uuid];
+//			[HDLLinphoneManager.instance.providerDelegate.uuids setObject:uuid forKey:callId];
+//			BOOL video = ([UIApplication sharedApplication].applicationState == UIApplicationStateActive &&
+//						  linphone_video_activation_policy_get_automatically_accept(linphone_core_get_video_activation_policy(LC)) &&
+//						  linphone_call_params_video_enabled(linphone_call_get_remote_params(call)));
+//			[HDLLinphoneManager.instance.providerDelegate reportIncomingCall:call withUUID:uuid handle:address video:video];
+//#else
+////			[PhoneMainView.instance displayIncomingCall:call];
+//#endif
+//				}
+//			} else if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
+//				// Create a UNNotification
+//				UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
+//				content.title = NSLocalizedString(@"Incoming call", nil);
+//				content.body = address;
+//				content.sound = [UNNotificationSound soundNamed:@"notes_of_the_optimistic.caf"];
+//				content.categoryIdentifier = @"call_cat";
+//				content.userInfo = @{ @"CallId" : callId };
+//				UNNotificationRequest *req =
+//					[UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL];
+//				[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:req
+//				 withCompletionHandler:^(NSError *err){
+//					}];
+//			}
+//		} else {
+//			if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
+//				// if (![LinphoneManager.instance popPushCallID:callId]) {
+//				// case where a remote notification is not already received
+//				// Create a new local notification
+//				if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+//					UIMutableUserNotificationAction *answer = [[UIMutableUserNotificationAction alloc] init];
+//					answer.identifier = @"answer";
+//					answer.title = NSLocalizedString(@"Answer", nil);
+//					answer.activationMode = UIUserNotificationActivationModeForeground;
+//					answer.destructive = NO;
+//					answer.authenticationRequired = YES;
+//
+//					UIMutableUserNotificationAction *decline = [[UIMutableUserNotificationAction alloc] init];
+//					decline.identifier = @"decline";
+//					decline.title = NSLocalizedString(@"Decline", nil);
+//					decline.activationMode = UIUserNotificationActivationModeBackground;
+//					decline.destructive = YES;
+//					decline.authenticationRequired = NO;
+//
+//					NSArray *callactions = @[ decline, answer ];
+//
+//					UIMutableUserNotificationCategory *callcat = [[UIMutableUserNotificationCategory alloc] init];
+//					callcat.identifier = @"incoming_call";
+//					[callcat setActions:callactions forContext:UIUserNotificationActionContextDefault];
+//					[callcat setActions:callactions forContext:UIUserNotificationActionContextMinimal];
+//
+//					NSSet *categories = [NSSet setWithObjects:callcat, nil];
+//
+//					UIUserNotificationSettings *set = [UIUserNotificationSettings
+//									   settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge |
+//											     UIUserNotificationTypeSound)
+//									   categories:categories];
+//					[[UIApplication sharedApplication] registerUserNotificationSettings:set];
+//					data->notification = [[UILocalNotification alloc] init];
+//					if (data->notification) {
+//						// iOS8 doesn't need the timer trick for the local notification.
+//						data->notification.category = @"incoming_call";
+//						if ([[UIDevice currentDevice].systemVersion floatValue] >= 8 &&
+//						    [self lpConfigBoolForKey:@"repeat_call_notification"] == NO) {
+//							NSString *ring = ([HDLLinphoneManager bundleFile:[self lpConfigStringForKey:@"local_ring"
+//												       inSection:@"sound"]
+//									   .lastPathComponent]
+//									  ?: [HDLLinphoneManager bundleFile:@"notes_of_the_optimistic.caf"])
+//								.lastPathComponent;
+//							data->notification.soundName = ring;
+//						} else {
+//							data->notification.soundName = @"shortring.caf";
+//							data->timer = [NSTimer scheduledTimerWithTimeInterval:5
+//								       target:self
+//								       selector:@selector(localNotifContinue:)
+//								       userInfo:data->notification
+//								       repeats:TRUE];
+//						}
+//
+//						data->notification.repeatInterval = 0;
+//
+//						data->notification.alertBody =
+//							[NSString stringWithFormat:NSLocalizedString(@"IC_MSG", nil), address];
+//						// data->notification.alertAction = NSLocalizedString(@"Answer", nil);
+//						data->notification.userInfo = @{ @"callId" : callId, @"timer" : [NSNumber numberWithInt:1] };
+//						data->notification.applicationIconBadgeNumber = 1;
+//						UIApplication *app = [UIApplication sharedApplication];
+//						LOGI([app currentUserNotificationSettings].description);
+//						[app presentLocalNotificationNow:data->notification];
+//
+//						if (!incallBgTask) {
+//							incallBgTask =
+//								[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
+//										LOGW(@"Call cannot ring any more, too late");
+//										[[UIApplication sharedApplication] endBackgroundTask:incallBgTask];
+//										incallBgTask = 0;
+//									}];
+//
+//							if (data->timer) {
+//								[[NSRunLoop currentRunLoop] addTimer:data->timer forMode:NSRunLoopCommonModes];
+//							}
+//						}
+//					}
+//				}
+//			}
+//		}
+	}
+
+	// we keep the speaker auto-enabled state in this static so that we don't
+	// force-enable it on ICE re-invite if the user disabled it.
+	static BOOL speaker_already_enabled = FALSE;
+
+    if (state==LinphoneCallStateOutgoingProgress) {
+        NSLog(@"绂佹楹﹀厠椋�");
+        [HDLLinphoneManager.instance enableMicro:false];
+    }
+	// Disable speaker when no more call
+	if ((state == LinphoneCallEnd || state == LinphoneCallError)) {
+//		[HistoryListTableView saveDataToUserDefaults];
+		[[UIDevice currentDevice] setProximityMonitoringEnabled:FALSE];
+		speaker_already_enabled = FALSE;
+		if (linphone_core_get_calls_nb(theLinphoneCore) == 0) {
+			[self setSpeakerEnabled:FALSE];
+			[self removeCTCallCenterCb];
+			// disable this because I don't find anygood reason for it: _bluetoothAvailable = FALSE;
+			// furthermore it introduces a bug when calling multiple times since route may not be
+			// reconfigured between cause leading to bluetooth being disabled while it should not
+			_bluetoothEnabled = FALSE;
+		}
+
+		if (incallBgTask) {
+			[[UIApplication sharedApplication] endBackgroundTask:incallBgTask];
+			incallBgTask = 0;
+		}
+
+		if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
+			if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
+				if (data->timer) {
+					[data->timer invalidate];
+					data->timer = nil;
+				}
+				LinphoneCallLog *UNlog = linphone_call_get_call_log(call);
+				if ((UNlog == NULL
+				     || linphone_call_log_get_status(UNlog) == LinphoneCallMissed
+				     || linphone_call_log_get_status(UNlog) == LinphoneCallAborted
+				     || linphone_call_log_get_status(UNlog) == LinphoneCallEarlyAborted)) {
+					UNMutableNotificationContent *missed_content = [[UNMutableNotificationContent alloc] init];
+					missed_content.title = NSLocalizedString(@"Missed call", nil);
+					missed_content.body = address;
+					UNNotificationRequest *missed_req = [UNNotificationRequest requestWithIdentifier:@"call_request"
+									     content:missed_content
+									     trigger:NULL];
+					[UNUserNotificationCenter.currentNotificationCenter addNotificationRequest:missed_req
+					 withCompletionHandler:^(NSError *_Nullable error)
+					 {
+//                        if (error)
+//                         LOGD(@"Error while adding notification request : %@", error.description);
+                        
+                    }];
+				}
+			}
+			LinphoneCallLog *callLog2 = linphone_call_get_call_log(call);
+			const char *call_id2 = linphone_call_log_get_call_id(callLog2);
+			NSString *callId2 = call_id2
+				? [NSString stringWithUTF8String:call_id2]
+				: @"";
+			NSUUID *uuid = (NSUUID *)[self.providerDelegate.uuids objectForKey:callId2];
+			if (uuid) {
+				LinphoneCall *callKit_call = (LinphoneCall *)linphone_core_get_calls(LC)
+					? linphone_core_get_calls(LC)->data
+					: NULL;
+				const char *callKit_callId = callKit_call
+					? linphone_call_log_get_call_id(linphone_call_get_call_log(callKit_call))
+					: NULL;
+				if (callKit_callId && !_conf) {
+					// Create a CallKit call because there's not !
+					NSString *callKit_callIdNS = [NSString stringWithUTF8String:callKit_callId];
+					NSUUID *callKit_uuid = [NSUUID UUID];
+					[HDLLinphoneManager.instance.providerDelegate.uuids setObject:callKit_uuid forKey:callKit_callIdNS];
+					[HDLLinphoneManager.instance.providerDelegate.calls setObject:callKit_callIdNS forKey:callKit_uuid];
+//					NSString *address = [FastAddressBook displayNameForAddress:linphone_call_get_remote_address(callKit_call)];
+                    NSString *address=@"";
+					CXHandle *handle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:address];
+					CXStartCallAction *act = [[CXStartCallAction alloc] initWithCallUUID:callKit_uuid handle:handle];
+					CXTransaction *tr = [[CXTransaction alloc] initWithAction:act];
+					[HDLLinphoneManager.instance.providerDelegate.controller requestTransaction:tr completion:^(NSError *err){}];
+					[HDLLinphoneManager.instance.providerDelegate.provider reportOutgoingCallWithUUID:callKit_uuid startedConnectingAtDate:nil];
+					[HDLLinphoneManager.instance.providerDelegate.provider reportOutgoingCallWithUUID:callKit_uuid connectedAtDate:nil];
+				}
+
+				CXEndCallAction *act = [[CXEndCallAction alloc] initWithCallUUID:uuid];
+				CXTransaction *tr = [[CXTransaction alloc] initWithAction:act];
+				[HDLLinphoneManager.instance.providerDelegate.controller requestTransaction:tr completion:^(NSError *err){}];
+				LOGI(@"CallKit - clearing CK as call ended on uuid %@",uuid);
+				[HDLLinphoneManager.instance.providerDelegate.provider reportOutgoingCallWithUUID:uuid connectedAtDate:[NSDate date]];
+				[self.providerDelegate.uuids removeObjectForKey:callId2];
+				[self.providerDelegate.calls removeObjectForKey:uuid];
+				[self.providerDelegate.provider reportCallWithUUID:uuid endedAtDate:[NSDate date] reason:(state == LinphoneCallError ? CXCallEndedReasonFailed : CXCallEndedReasonRemoteEnded)];
+			} else { // Can happen when Call-ID changes (Replaces header)
+				if (linphone_core_get_calls_nb(LC) ==0) { // Need to clear all CK calls
+					for (NSUUID *myUuid in self.providerDelegate.calls) {
+						[self.providerDelegate.provider reportCallWithUUID:myUuid
+						 endedAtDate:NULL
+						 reason:(state == LinphoneCallError
+							 ? CXCallEndedReasonFailed
+							 : CXCallEndedReasonRemoteEnded)];
+					}
+					[self.providerDelegate.uuids removeAllObjects];
+					[self.providerDelegate.calls removeAllObjects];
+				}
+			}
+		} else {
+			if (data != nil && data->notification != nil) {
+				LinphoneCallLog *log = linphone_call_get_call_log(call);
+				// cancel local notif if needed
+				if (data->timer) {
+					[data->timer invalidate];
+					data->timer = nil;
+				}
+				[[UIApplication sharedApplication] cancelLocalNotification:data->notification];
+				data->notification = nil;
+
+				if (log == NULL || linphone_call_log_get_status(log) == LinphoneCallMissed) {
+					UILocalNotification *notification = [[UILocalNotification alloc] init];
+					notification.repeatInterval = 0;
+					notification.alertBody = [NSString stringWithFormat:
+								  NSLocalizedString(@"You missed a call from %@",nil), address];
+					notification.alertAction = NSLocalizedString(@"Show", nil);
+					notification.userInfo = [NSDictionary dictionaryWithObject: [NSString stringWithUTF8String:linphone_call_log_get_call_id(log)]
+								 forKey:@"callLog"];
+					[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
+				}
+			}
+		}
+//		if (state == LinphoneCallError)
+//			[PhoneMainView.instance popCurrentView];
+	}
+	if (state == LinphoneCallReleased) {
+		if (data != NULL) {
+			linphone_call_set_user_data(call, NULL);
+			CFBridgingRelease((__bridge CFTypeRef)(data));
+		}
+	}
+	// Enable speaker when video
+	if (state == LinphoneCallIncomingReceived || state == LinphoneCallOutgoingInit ||
+	    state == LinphoneCallConnected || state == LinphoneCallStreamsRunning) {
+		if (linphone_call_params_video_enabled( linphone_call_get_current_params(call)) && !speaker_already_enabled && !_bluetoothEnabled) {
+			[self setSpeakerEnabled:TRUE];
+			speaker_already_enabled = TRUE;
+		}
+	}
+	if (state == LinphoneCallStreamsRunning) {
+		if (_speakerBeforePause) {
+			_speakerBeforePause = FALSE;
+			[self setSpeakerEnabled:TRUE];
+			speaker_already_enabled = TRUE;
+		}
+	}
+	if (state == LinphoneCallConnected && !mCallCenter) {
+		/*only register CT call center CB for connected call*/
+		[self setupGSMInteraction];
+		[[UIDevice currentDevice] setProximityMonitoringEnabled:!(_speakerEnabled || _bluetoothEnabled)];
+	}
+
+	// Post event
+    
+	NSDictionary *dict = @{@"call" : [NSValue valueWithPointer:call],
+			       @"state" : [NSNumber numberWithInt:state],
+			       @"message" : [NSString stringWithUTF8String:message],
+                   @"userName" : [NSString stringWithUTF8String:linphone_address_get_username(addr)]
+    };
+
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate
+	 object:self
+	 userInfo:dict];
+}
+
+static void linphone_iphone_call_state(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState state,
+				       const char *message) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onCall:call StateChanged:state withMessage:message];
+}
+
+#pragma mark - Transfert State Functions
+
+static void linphone_iphone_transfer_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState state) {
+}
+
+#pragma mark - Global state change
+
+static void linphone_iphone_global_state_changed(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onGlobalStateChanged:gstate withMessage:message];
+}
+
+- (void)onGlobalStateChanged:(LinphoneGlobalState)state withMessage:(const char *)message {
+//	LOGI(@"onGlobalStateChanged: %d (message: %s)", state, message);
+
+	NSDictionary *dict = [NSDictionary
+			      dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:state], @"state",
+			      [NSString stringWithUTF8String:message ? message : ""], @"message", nil];
+
+	// dispatch the notification asynchronously
+	dispatch_async(dispatch_get_main_queue(), ^(void) {
+			[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneGlobalStateUpdate object:self userInfo:dict];
+		});
+}
+
+- (void)globalStateChangedNotificationHandler:(NSNotification *)notif {
+	if ((LinphoneGlobalState)[[[notif userInfo] valueForKey:@"state"] integerValue] == LinphoneGlobalOn) {
+		[self finishCoreConfiguration];
+	}
+}
+
+#pragma mark - Configuring status changed
+
+static void linphone_iphone_configuring_status_changed(LinphoneCore *lc, LinphoneConfiguringState status,
+						       const char *message) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onConfiguringStatusChanged:status withMessage:message];
+}
+
+- (void)onConfiguringStatusChanged:(LinphoneConfiguringState)status withMessage:(const char *)message {
+	NSLog(@"onConfiguringStatusChanged: %s %@", linphone_configuring_state_to_string(status),
+	     message ? [NSString stringWithFormat:@"(message: %s)", message] : @"");
+	NSDictionary *dict = [NSDictionary
+			      dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:status], @"state",
+			      [NSString stringWithUTF8String:message ? message : ""], @"message", nil];
+
+	// dispatch the notification asynchronously
+	dispatch_async(dispatch_get_main_queue(), ^(void) {
+			[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneConfiguringStateUpdate
+			 object:self
+			 userInfo:dict];
+		});
+}
+
+- (void)configuringStateChangedNotificationHandler:(NSNotification *)notif {
+	_wasRemoteProvisioned = ((LinphoneConfiguringState)[[[notif userInfo] valueForKey:@"state"] integerValue] ==
+				 LinphoneConfiguringSuccessful);
+	if (_wasRemoteProvisioned) {
+		LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC);
+		if (cfg) {
+			[self configurePushTokenForProxyConfig:cfg];
+		}
+	}
+}
+
+#pragma mark - Registration State Functions
+
+- (void)onRegister:(LinphoneCore *)lc
+cfg:(LinphoneProxyConfig *)cfg
+state:(LinphoneRegistrationState)state
+message:(const char *)cmessage {
+	NSLog(@"New registration state: %s (message: %s)", linphone_registration_state_to_string(state), cmessage);
+
+	LinphoneReason reason = linphone_proxy_config_get_error(cfg);
+	NSString *message = nil;
+	switch (reason) {
+	case LinphoneReasonBadCredentials:
+		message = NSLocalizedString(@"Bad credentials, check your account settings", nil);
+		break;
+	case LinphoneReasonNoResponse:
+		message = NSLocalizedString(@"No response received from remote", nil);
+		break;
+	case LinphoneReasonUnsupportedContent:
+		message = NSLocalizedString(@"Unsupported content", nil);
+		break;
+	case LinphoneReasonIOError:
+		message = NSLocalizedString(
+					    @"Cannot reach the server: either it is an invalid address or it may be temporary down.", nil);
+		break;
+
+	case LinphoneReasonUnauthorized:
+		message = NSLocalizedString(@"Operation is unauthorized because missing credential", nil);
+		break;
+	case LinphoneReasonNoMatch:
+		message = NSLocalizedString(@"Operation could not be executed by server or remote client because it "
+					    @"didn't have any context for it",
+					    nil);
+		break;
+	case LinphoneReasonMovedPermanently:
+		message = NSLocalizedString(@"Resource moved permanently", nil);
+		break;
+	case LinphoneReasonGone:
+		message = NSLocalizedString(@"Resource no longer exists", nil);
+		break;
+	case LinphoneReasonTemporarilyUnavailable:
+		message = NSLocalizedString(@"Temporarily unavailable", nil);
+		break;
+	case LinphoneReasonAddressIncomplete:
+		message = NSLocalizedString(@"Address incomplete", nil);
+		break;
+	case LinphoneReasonNotImplemented:
+		message = NSLocalizedString(@"Not implemented", nil);
+		break;
+	case LinphoneReasonBadGateway:
+		message = NSLocalizedString(@"Bad gateway", nil);
+		break;
+	case LinphoneReasonServerTimeout:
+		message = NSLocalizedString(@"Server timeout", nil);
+		break;
+	case LinphoneReasonNotAcceptable:
+	case LinphoneReasonDoNotDisturb:
+	case LinphoneReasonDeclined:
+	case LinphoneReasonNotFound:
+	case LinphoneReasonNotAnswered:
+	case LinphoneReasonBusy:
+	case LinphoneReasonNone:
+	case LinphoneReasonUnknown:
+		message = NSLocalizedString(@"Unknown error", nil);
+		break;
+	}
+
+	// Post event
+	NSDictionary *dict =
+		[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:state], @"state",
+		 [NSValue valueWithPointer:cfg], @"cfg", message, @"message", nil];
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneRegistrationUpdate object:self userInfo:dict];
+}
+
+static void linphone_iphone_registration_state(LinphoneCore *lc, LinphoneProxyConfig *cfg,
+					       LinphoneRegistrationState state, const char *message) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onRegister:lc cfg:cfg state:state message:message];
+}
+
+#pragma mark - Auth info Function
+
+static void linphone_iphone_popup_password_request(LinphoneCore *lc, LinphoneAuthInfo *auth_info, LinphoneAuthMethod method) {
+	// let the wizard handle its own errors
+//	if ([PhoneMainView.instance currentView] != AssistantView.compositeViewDescription) {
+//		const char * realmC = linphone_auth_info_get_realm(auth_info);
+//		const char * usernameC = linphone_auth_info_get_username(auth_info);
+//		const char * domainC = linphone_auth_info_get_domain(auth_info);
+//		static UIAlertController *alertView = nil;
+//
+//		// avoid having multiple popups
+//		[PhoneMainView.instance dismissViewControllerAnimated:YES completion:nil];
+//
+//		// dont pop up if we are in background, in any case we will refresh registers when entering
+//		// the application again
+//		if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) {
+//			return;
+//		}
+//
+//		NSString *realm = [NSString stringWithUTF8String:realmC?:domainC];
+//		NSString *username = [NSString stringWithUTF8String:usernameC];
+//		NSString *domain = [NSString stringWithUTF8String:domainC];
+//		alertView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Authentification needed", nil)
+//			     message:[NSString stringWithFormat:NSLocalizedString(@"Connection failed because authentication is "
+//										  @"missing or invalid for %@@%@.\nYou can "
+//										  @"provide password again, or check your "
+//										  @"account configuration in the settings.", nil), username, realm]
+//			     preferredStyle:UIAlertControllerStyleAlert];
+//
+//		UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil)
+//						style:UIAlertActionStyleDefault
+//						handler:^(UIAlertAction * action) {}];
+//
+//		[alertView addTextFieldWithConfigurationHandler:^(UITextField *textField) {
+//				textField.placeholder = NSLocalizedString(@"Password", nil);
+//				textField.clearButtonMode = UITextFieldViewModeWhileEditing;
+//				textField.borderStyle = UITextBorderStyleRoundedRect;
+//				textField.secureTextEntry = YES;
+//			}];
+//
+//		UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Confirm password", nil)
+//						 style:UIAlertActionStyleDefault
+//						 handler:^(UIAlertAction * action) {
+//				NSString *password = alertView.textFields[0].text;
+//				LinphoneAuthInfo *info =
+//				linphone_auth_info_new(username.UTF8String, NULL, password.UTF8String, NULL,
+//						       realm.UTF8String, domain.UTF8String);
+//				linphone_core_add_auth_info(LC, info);
+//				[HDLLinphoneManager.instance refreshRegisters];
+//			}];
+//
+//		UIAlertAction* settingsAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Go to settings", nil)
+//						 style:UIAlertActionStyleDefault
+//						 handler:^(UIAlertAction * action) {
+//				[PhoneMainView.instance changeCurrentView:SettingsView.compositeViewDescription];
+//			}];
+//
+//		[alertView addAction:defaultAction];
+//		[alertView addAction:continueAction];
+//		[alertView addAction:settingsAction];
+//		[PhoneMainView.instance presentViewController:alertView animated:YES completion:nil];
+//	}
+}
+
+#pragma mark - Text Received Functions
+
+- (void)onMessageReceived:(LinphoneCore *)lc room:(LinphoneChatRoom *)room message:(LinphoneChatMessage *)msg {
+#pragma deploymate push "ignored-api-availability"
+	if (_silentPushCompletion) {
+		// we were woken up by a silent push. Call the completion handler with NEWDATA
+		// so that the push is notified to the user
+//		LOGI(@"onMessageReceived - handler %p", _silentPushCompletion);
+		_silentPushCompletion(UIBackgroundFetchResultNewData);
+		_silentPushCompletion = nil;
+	}
+#pragma deploymate pop
+	NSString *callID = [NSString stringWithUTF8String:linphone_chat_message_get_custom_header(msg, "Call-ID")];
+	const LinphoneAddress *peerAddress = linphone_chat_room_get_peer_address(room);
+//	NSString *from = [FastAddressBook displayNameForAddress:peerAddress];
+    NSString *from = @"";
+//
+//	const LinphoneAddress *fromAddress = linphone_chat_message_get_from_address(msg);
+//	NSString *fromMsg = [FastAddressBook displayNameForAddress:fromAddress];
+    NSString *fromMsg =@"";
+	char *peer_address = linphone_address_as_string_uri_only(peerAddress);
+	NSString *peer_uri = [NSString stringWithUTF8String:peer_address];
+	ms_free(peer_address);
+
+	const LinphoneAddress *localAddress = linphone_chat_room_get_local_address(room);
+	char *local_address = localAddress? linphone_address_as_string_uri_only(localAddress) : "";
+	NSString *local_uri = [NSString stringWithUTF8String:local_address];
+	ms_free(local_address);
+
+	int index = [(NSNumber *)[_pushDict objectForKey:callID] intValue] - 1;
+//	LOGI(@"Decrementing index of long running task for call id : %@ with index : %d", callID, index);
+	[_pushDict setValue:[NSNumber numberWithInt:index] forKey:callID];
+	BOOL need_bg_task = FALSE;
+	for (NSString *key in [_pushDict allKeys]) {
+		int value = [(NSNumber *)[_pushDict objectForKey:key] intValue];
+		if (value > 0) {
+			need_bg_task = TRUE;
+			break;
+		}
+	}
+	if (pushBgTaskMsg && !need_bg_task) {
+		LOGI(@"Message received, stopping message background task for call-id [%@]", callID);
+		[[UIApplication sharedApplication] endBackgroundTask:pushBgTaskMsg];
+		pushBgTaskMsg = 0;
+	}
+    
+	BOOL hasFile = FALSE;
+	// if auto_download is available and file is downloaded
+	if ((linphone_core_get_max_size_for_auto_download_incoming_files(LC) > -1) && linphone_chat_message_get_file_transfer_information(msg))
+		hasFile = TRUE;
+
+	if (!linphone_chat_message_is_file_transfer(msg) && !linphone_chat_message_is_text(msg) && !hasFile)
+		return;
+    
+	if (hasFile) {
+//		[ChatConversationView autoDownload:msg];
+	}
+
+	// Post event
+	NSDictionary *dict = @{
+		@"room" : [NSValue valueWithPointer:room],
+		@"from_address" : [NSValue valueWithPointer:linphone_chat_message_get_from_address(msg)],
+		@"message" : [NSValue valueWithPointer:msg],
+		@"call-id" : callID
+	};
+
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:self userInfo:dict];
+
+	if (linphone_chat_message_is_outgoing(msg))
+		return;
+
+	if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
+//		if ((PhoneMainView.instance.currentView == ChatsListView.compositeViewDescription))
+//			return;
+
+//		if (PhoneMainView.instance.currentView == ChatConversationView.compositeViewDescription && room == PhoneMainView.instance.currentRoom)
+//			return;
+	}
+
+	// Create a new notification
+	if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+		NSArray *actions;
+		if ([[UIDevice.currentDevice systemVersion] floatValue] < 9 ||
+		    [HDLLinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif"] == NO) {
+
+			UIMutableUserNotificationAction *reply = [[UIMutableUserNotificationAction alloc] init];
+			reply.identifier = @"reply";
+			reply.title = NSLocalizedString(@"Reply", nil);
+			reply.activationMode = UIUserNotificationActivationModeForeground;
+			reply.destructive = NO;
+			reply.authenticationRequired = YES;
+
+			UIMutableUserNotificationAction *mark_read = [[UIMutableUserNotificationAction alloc] init];
+			mark_read.identifier = @"mark_read";
+			mark_read.title = NSLocalizedString(@"Mark Read", nil);
+			mark_read.activationMode = UIUserNotificationActivationModeBackground;
+			mark_read.destructive = NO;
+			mark_read.authenticationRequired = NO;
+
+			actions = @[ mark_read, reply ];
+		} else {
+			// iOS 9 allows for inline reply. We don't propose mark_read in this case
+			UIMutableUserNotificationAction *reply_inline = [[UIMutableUserNotificationAction alloc] init];
+
+			reply_inline.identifier = @"reply_inline";
+			reply_inline.title = NSLocalizedString(@"Reply", nil);
+			reply_inline.activationMode = UIUserNotificationActivationModeBackground;
+			reply_inline.destructive = NO;
+			reply_inline.authenticationRequired = NO;
+			reply_inline.behavior = UIUserNotificationActionBehaviorTextInput;
+
+			actions = @[ reply_inline ];
+		}
+
+		UIMutableUserNotificationCategory *msgcat = [[UIMutableUserNotificationCategory alloc] init];
+		msgcat.identifier = @"incoming_msg";
+		[msgcat setActions:actions forContext:UIUserNotificationActionContextDefault];
+		[msgcat setActions:actions forContext:UIUserNotificationActionContextMinimal];
+
+		NSSet *categories = [NSSet setWithObjects:msgcat, nil];
+
+		UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound)
+						   categories:categories];
+		[[UIApplication sharedApplication] registerUserNotificationSettings:set];
+
+		UILocalNotification *notif = [[UILocalNotification alloc] init];
+		if (notif) {
+//			NSString *chat = [UIChatBubbleTextCell TextMessageForChat:msg];
+            NSString *chat = @"";
+			notif.repeatInterval = 0;
+			if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {
+#pragma deploymate push "ignored-api-availability"
+				notif.category = @"incoming_msg";
+#pragma deploymate pop
+			}
+			if ([HDLLinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES]) {
+				notif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"IM_FULLMSG", nil), from, chat];
+			} else {
+				notif.alertBody = [NSString stringWithFormat:NSLocalizedString(@"IM_MSG", nil), from];
+			}
+			notif.alertAction = NSLocalizedString(@"Show", nil);
+			notif.soundName = @"msg.caf";
+			notif.userInfo = @{@"from" : from, @"peer_addr" : peer_uri, @"local_addr" : local_uri, @"call-id" : callID};
+			notif.accessibilityLabel = @"Message notif";
+			[[UIApplication sharedApplication] presentLocalNotificationNow:notif];
+		}
+	} else {
+        //            NSString *chat = [UIChatBubbleTextCell TextMessageForChat:msg];
+        NSString *chat = @"";
+
+		UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
+		content.title = NSLocalizedString(@"Message received", nil);
+		const char* subject = linphone_chat_room_get_subject(room) ?: LINPHONE_DUMMY_SUBJECT;
+		if ([HDLLinphoneManager.instance lpConfigBoolForKey:@"show_msg_in_notif" withDefault:YES]) {
+			content.subtitle = strcmp(subject, LINPHONE_DUMMY_SUBJECT) != 0 ? [NSString stringWithUTF8String:subject] : fromMsg;
+			content.body = strcmp(subject, LINPHONE_DUMMY_SUBJECT) != 0
+				? [NSString stringWithFormat:@"%@ : %@", fromMsg, chat]
+				: chat;
+		} else {
+			content.body = strcmp(subject, LINPHONE_DUMMY_SUBJECT) != 0
+				? [NSString stringWithFormat:@"%@ : %@",[NSString stringWithUTF8String:subject], fromMsg]
+				: fromMsg;
+		}
+		content.sound = [UNNotificationSound soundNamed:@"msg.caf"];
+		content.categoryIdentifier = @"msg_cat";
+		// save data to user info for rich notification content
+		NSMutableArray *msgs = [NSMutableArray array];
+		bctbx_list_t *history = linphone_chat_room_get_history(room, 6);
+		while (history) {
+//			NSMutableDictionary *msgData = [NSMutableDictionary dictionary];
+//			LinphoneChatMessage *msg = history->data;
+//			const char *state = linphone_chat_message_state_to_string(linphone_chat_message_get_state(msg));
+//			bool_t isOutgoing = linphone_chat_message_is_outgoing(msg);
+//			bool_t isFileTransfer = (linphone_chat_message_get_file_transfer_information(msg) != NULL);
+//			const LinphoneAddress *fromAddress = linphone_chat_message_get_from_address(msg);
+//			NSString *displayNameDate = [NSString stringWithFormat:@"%@ - %@", [LinphoneUtils timeToString:linphone_chat_message_get_time(msg)
+//											    withFormat:LinphoneDateChatBubble],
+//						     [FastAddressBook displayNameForAddress:fromAddress]];
+//			UIImage *fromImage = [UIImage resizeImage:[FastAddressBook imageForAddress:fromAddress]
+//					      withMaxWidth:200
+//					      andMaxHeight:200];
+//			NSData *fromImageData = UIImageJPEGRepresentation(fromImage, 1);
+//			[msgData setObject:[NSString stringWithUTF8String:state] forKey:@"state"];
+//			[msgData setObject:displayNameDate forKey:@"displayNameDate"];
+//			[msgData setObject:[NSNumber numberWithBool:isFileTransfer] forKey:@"isFileTransfer"];
+//			[msgData setObject:fromImageData forKey:@"fromImageData"];
+//			if (isFileTransfer) {
+//				LinphoneContent *file = linphone_chat_message_get_file_transfer_information(msg);
+//				const char *filename = linphone_content_get_name(file);
+//				[msgData setObject:[NSString stringWithUTF8String:filename] forKey:@"msg"];
+//			} else {
+//				[msgData setObject:[UIChatBubbleTextCell TextMessageForChat:msg] forKey:@"msg"];
+//			}
+//			[msgData setObject:[NSNumber numberWithBool:isOutgoing] forKey:@"isOutgoing"];
+//			[msgs addObject:msgData];
+//			history = bctbx_list_next(history);
+		}
+		content.userInfo = @{@"from" : from, @"peer_addr" : peer_uri, @"local_addr" : local_uri, @"CallId" : callID, @"msgs" : msgs};
+		content.accessibilityLabel = @"Message notif";
+		UNNotificationRequest *req = [UNNotificationRequest requestWithIdentifier:@"call_request" content:content trigger:NULL];
+		[[UNUserNotificationCenter currentNotificationCenter]
+		 addNotificationRequest:req
+		 withCompletionHandler:^(NSError *_Nullable error) {
+				// Enable or disable features based on authorization.
+				if (error) {
+					LOGD(@"Error while adding notification request :");
+					LOGD(error.description);
+				}
+			}];
+	}
+//	[ChatsListTableView saveDataToUserDefaults];
+//	[HistoryListTableView saveDataToUserDefaults];
+}
+
+static void linphone_iphone_message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onMessageReceived:lc room:room message:message];
+}
+
+static void linphone_iphone_message_received_unable_decrypt(LinphoneCore *lc, LinphoneChatRoom *room,
+							    LinphoneChatMessage *message) {
+
+	NSString *callId = [NSString stringWithUTF8String:linphone_chat_message_get_custom_header(message, "Call-ID")];
+	int index = [(NSNumber *)[HDLLinphoneManager.instance.pushDict objectForKey:callId] intValue] - 1;
+	LOGI(@"Decrementing index of long running task for call id : %@ with index : %d", callId, index);
+	[HDLLinphoneManager.instance.pushDict setValue:[NSNumber numberWithInt:index] forKey:callId];
+	BOOL need_bg_task = FALSE;
+	for (NSString *key in [HDLLinphoneManager.instance.pushDict allKeys]) {
+		int value = [(NSNumber *)[HDLLinphoneManager.instance.pushDict objectForKey:key] intValue];
+		if (value > 0) {
+			need_bg_task = TRUE;
+			break;
+		}
+	}
+	if (theLinphoneManager->pushBgTaskMsg && !need_bg_task) {
+		LOGI(@"Message received, stopping message background task for call-id [%@]", callId);
+		[[UIApplication sharedApplication] endBackgroundTask:theLinphoneManager->pushBgTaskMsg];
+		theLinphoneManager->pushBgTaskMsg = 0;
+	}
+	const LinphoneAddress *address = linphone_chat_message_get_peer_address(message);
+//	NSString *strAddr = [FastAddressBook displayNameForAddress:address];
+    NSString *strAddr =@"";
+
+	NSString *title = NSLocalizedString(@"LIME warning", nil);
+	NSString *body = [NSString
+			  stringWithFormat:NSLocalizedString(@"You have received an encrypted message you are unable to decrypt from "
+							     @"%@.\nYou need to call your correspondant in order to exchange your ZRTP "
+							     @"keys if you want to decrypt the future messages you will receive.",
+							     nil),
+			  strAddr];
+	NSString *action = NSLocalizedString(@"Call", nil);
+
+	if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
+		if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
+			UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
+			content.title = title;
+			content.body = body;
+			UNNotificationRequest *req =
+				[UNNotificationRequest requestWithIdentifier:@"decrypt_request" content:content trigger:NULL];
+			[[UNUserNotificationCenter currentNotificationCenter]
+			 addNotificationRequest:req
+			 withCompletionHandler:^(NSError *_Nullable error) {
+					// Enable or disable features based on authorization.
+					if (error) {
+						LOGD(@"Error while adding notification request :");
+						LOGD(error.description);
+					}
+				}];
+		} else {
+			UILocalNotification *notification = [[UILocalNotification alloc] init];
+			notification.repeatInterval = 0;
+			notification.alertTitle = title;
+			notification.alertBody = body;
+			[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
+		}
+	} else {
+		UIAlertController *errView =
+			[UIAlertController alertControllerWithTitle:title message:body preferredStyle:UIAlertControllerStyleAlert];
+
+		UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
+						style:UIAlertActionStyleDefault
+						handler:^(UIAlertAction *action){
+			}];
+
+		UIAlertAction *callAction = [UIAlertAction actionWithTitle:action
+					     style:UIAlertActionStyleDefault
+					     handler:^(UIAlertAction *action) {
+				[HDLLinphoneManager.instance call:address];
+			}];
+
+		[errView addAction:defaultAction];
+		[errView addAction:callAction];
+//		[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
+	}
+}
+
+- (void)onNotifyReceived:(LinphoneCore *)lc
+event:(LinphoneEvent *)lev
+notifyEvent:(const char *)notified_event
+content:(const LinphoneContent *)body {
+	// Post event
+	NSMutableDictionary *dict = [NSMutableDictionary dictionary];
+	[dict setObject:[NSValue valueWithPointer:lev] forKey:@"event"];
+	[dict setObject:[NSString stringWithUTF8String:notified_event] forKey:@"notified_event"];
+	if (body != NULL) {
+		[dict setObject:[NSValue valueWithPointer:body] forKey:@"content"];
+	}
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneNotifyReceived object:self userInfo:dict];
+}
+
+static void linphone_iphone_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *notified_event,
+					    const LinphoneContent *body) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onNotifyReceived:lc
+	 event:lev
+	 notifyEvent:notified_event
+	 content:body];
+}
+
+- (void)onNotifyPresenceReceivedForUriOrTel:(LinphoneCore *)lc
+friend:(LinphoneFriend *)lf
+uri:(const char *)uri
+presenceModel:(const LinphonePresenceModel *)model {
+	// Post event
+	NSMutableDictionary *dict = [NSMutableDictionary dictionary];
+	[dict setObject:[NSValue valueWithPointer:lf] forKey:@"friend"];
+	[dict setObject:[NSValue valueWithPointer:uri] forKey:@"uri"];
+	[dict setObject:[NSValue valueWithPointer:model] forKey:@"presence_model"];
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneNotifyPresenceReceivedForUriOrTel
+	 object:self
+	 userInfo:dict];
+}
+
+static void linphone_iphone_notify_presence_received_for_uri_or_tel(LinphoneCore *lc, LinphoneFriend *lf,
+								    const char *uri_or_tel,
+								    const LinphonePresenceModel *presence_model) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onNotifyPresenceReceivedForUriOrTel:lc
+	 friend:lf
+	 uri:uri_or_tel
+	 presenceModel:presence_model];
+}
+
+static void linphone_iphone_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t on,
+						    const char *authentication_token) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onCallEncryptionChanged:lc
+	 call:call
+	 on:on
+	 token:authentication_token];
+}
+
+- (void)onCallEncryptionChanged:(LinphoneCore *)lc
+call:(LinphoneCall *)call
+on:(BOOL)on
+token:(const char *)authentication_token {
+	// Post event
+	NSMutableDictionary *dict = [NSMutableDictionary dictionary];
+	[dict setObject:[NSValue valueWithPointer:call] forKey:@"call"];
+	[dict setObject:[NSNumber numberWithBool:on] forKey:@"on"];
+	if (authentication_token) {
+		[dict setObject:[NSString stringWithUTF8String:authentication_token] forKey:@"token"];
+	}
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallEncryptionChanged object:self userInfo:dict];
+}
+
+void linphone_iphone_chatroom_state_changed(LinphoneCore *lc, LinphoneChatRoom *cr, LinphoneChatRoomState state) {
+    if (state == LinphoneChatRoomStateCreated) {
+        [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneMessageReceived object:nil];
+    }
+}
+
+void linphone_iphone_version_update_check_result_received (LinphoneCore *lc, LinphoneVersionUpdateCheckResult result, const char *version, const char *url) {
+	if (result == LinphoneVersionUpdateCheckUpToDate || result == LinphoneVersionUpdateCheckError) {
+		return;
+	}
+	NSString *title = NSLocalizedString(@"Outdated Version", nil);
+	NSString *body = NSLocalizedString(@"A new version of your app is available, use the button below to download it.", nil);
+
+	UIAlertController *versVerifView = [UIAlertController alertControllerWithTitle:title
+					    message:body
+					    preferredStyle:UIAlertControllerStyleAlert];
+
+	NSString *ObjCurl = [NSString stringWithUTF8String:url];
+	UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Download", nil)
+					style:UIAlertActionStyleDefault
+					handler:^(UIAlertAction * action) {
+			[[UIApplication sharedApplication] openURL:[NSURL URLWithString:ObjCurl]];
+		}];
+
+	[versVerifView addAction:defaultAction];
+//	[PhoneMainView.instance presentViewController:versVerifView animated:YES completion:nil];
+}
+
+void linphone_iphone_qr_code_found(LinphoneCore *lc, const char *result) {
+	NSDictionary *eventDic = [NSDictionary dictionaryWithObject:[NSString stringWithCString:result encoding:[NSString defaultCStringEncoding]] forKey:@"qrcode"];
+	LOGD(@"QRCODE FOUND");
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneQRCodeFound object:nil userInfo:eventDic];
+}
+
+#pragma mark - Message composition start
+- (void)alertLIME:(LinphoneChatRoom *)room {
+	NSString *title = NSLocalizedString(@"LIME warning", nil);
+	NSString *body =
+		NSLocalizedString(@"You are trying to send a message using LIME to a contact not verified by ZRTP.\n"
+				  @"Please call this contact and verify his ZRTP key before sending your messages.",
+				  nil);
+
+	if ([UIApplication sharedApplication].applicationState == UIApplicationStateActive) {
+		UIAlertController *errView =
+			[UIAlertController alertControllerWithTitle:title message:body preferredStyle:UIAlertControllerStyleAlert];
+
+		UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK"
+						style:UIAlertActionStyleDefault
+						handler:^(UIAlertAction *action){}];
+		[errView addAction:defaultAction];
+
+		UIAlertAction *callAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Call", nil)
+					     style:UIAlertActionStyleDefault
+					     handler:^(UIAlertAction *action) {
+				[self call:linphone_chat_room_get_peer_address(room)];
+			}];
+		[errView addAction:callAction];
+//		[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
+	} else {
+		if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
+			UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
+			content.title = title;
+			content.body = body;
+			content.categoryIdentifier = @"lime";
+
+			UNNotificationRequest *req = [UNNotificationRequest
+						      requestWithIdentifier:@"lime_request"
+						      content:content
+						      trigger:[UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO]];
+			[[UNUserNotificationCenter currentNotificationCenter]
+			 addNotificationRequest:req
+			 withCompletionHandler:^(NSError *_Nullable error) {
+					// Enable or disable features based on authorization.
+					if (error) {
+						LOGD(@"Error while adding notification request :");
+						LOGD(error.description);
+					}
+				}];
+		} else {
+			UILocalNotification *notification = [[UILocalNotification alloc] init];
+			notification.repeatInterval = 0;
+			notification.alertTitle = title;
+			notification.alertBody = body;
+			[[UIApplication sharedApplication] presentLocalNotificationNow:notification];
+		}
+	}
+}
+
+- (void)onMessageComposeReceived:(LinphoneCore *)core forRoom:(LinphoneChatRoom *)room {
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneTextComposeEvent
+	 object:self
+	 userInfo:@{
+			@"room" : [NSValue valueWithPointer:room]
+				}];
+}
+
+static void linphone_iphone_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) {
+	[(__bridge HDLLinphoneManager *)linphone_core_cbs_get_user_data(linphone_core_get_current_callbacks(lc)) onMessageComposeReceived:lc forRoom:room];
+}
+
+#pragma mark - Network Functions
+
+
+- (NetworkType)network {
+	if ([[[UIDevice currentDevice] systemVersion] floatValue] < 7) {
+		UIApplication *app = [UIApplication sharedApplication];
+		NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
+		NSNumber *dataNetworkItemView = nil;
+
+		for (id subview in subviews) {
+			if ([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
+				dataNetworkItemView = subview;
+				break;
+			}
+		}
+
+		NSNumber *number = (NSNumber *)[dataNetworkItemView valueForKey:@"dataNetworkType"];
+		return [number intValue];
+	} else {
+#pragma deploymate push "ignored-api-availability"
+		CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
+		NSString *currentRadio = info.currentRadioAccessTechnology;
+		if ([currentRadio isEqualToString:CTRadioAccessTechnologyEdge]) {
+			return network_2g;
+		} else if ([currentRadio isEqualToString:CTRadioAccessTechnologyLTE]) {
+			return network_4g;
+		}
+#pragma deploymate pop
+		return network_3g;
+	}
+}
+
+#pragma mark -
+
+// scheduling loop
+- (void)iterate {
+	UIBackgroundTaskIdentifier coreIterateTaskId = 0;
+	coreIterateTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
+			LOGW(@"Background task for core iteration launching expired.");
+			[[UIApplication sharedApplication] endBackgroundTask:coreIterateTaskId];
+		}];
+	linphone_core_iterate(theLinphoneCore);
+	if (coreIterateTaskId != UIBackgroundTaskInvalid)
+		[[UIApplication sharedApplication] endBackgroundTask:coreIterateTaskId];
+}
+
+- (void)audioSessionInterrupted:(NSNotification *)notification {
+	int interruptionType = [notification.userInfo[AVAudioSessionInterruptionTypeKey] intValue];
+	if (interruptionType == AVAudioSessionInterruptionTypeBegan) {
+		[self beginInterruption];
+	} else if (interruptionType == AVAudioSessionInterruptionTypeEnded) {
+		[self endInterruption];
+	}
+}
+
+/** Should be called once per linphone_core_new() */
+- (void)finishCoreConfiguration {
+	//Force keep alive to workaround push notif on chat message
+	linphone_core_enable_keep_alive(theLinphoneCore, true);
+
+	// get default config from bundle
+	NSString *zrtpSecretsFileName = [HDLLinphoneManager dataFile:@"zrtp_secrets"];
+	NSString *chatDBFileName = [HDLLinphoneManager dataFile:kLinphoneInternalChatDBFilename];
+	NSString *device = [[NSMutableString alloc] initWithString:[NSString stringWithFormat:@"%@iOS/%@ (%@) LinphoneSDK",
+								    [NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"],
+								    [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"],
+								    [[UIDevice currentDevice] name]]];
+
+    linphone_core_set_user_agent(theLinphoneCore, device.UTF8String, LINPHONE_SDK_VERSION.UTF8String);
+
+	_contactSipField = [self lpConfigStringForKey:@"contact_im_type_value" inSection:@"sip" withDefault:@"SIP"];
+
+//	if (_fastAddressBook == nil) {
+//		_fastAddressBook = [[FastAddressBook alloc] init];
+//	}
+
+	linphone_core_set_zrtp_secrets_file(theLinphoneCore, [zrtpSecretsFileName UTF8String]);
+	//linphone_core_set_chat_database_path(theLinphoneCore, [chatDBFileName UTF8String]);
+	linphone_core_set_call_logs_database_path(theLinphoneCore, [chatDBFileName UTF8String]);
+
+	NSString *path = [HDLLinphoneManager bundleFile:@"nowebcamCIF.jpg"];
+	if (path) {
+		const char *imagePath = [path UTF8String];
+		LOGI(@"Using '%s' as source image for no webcam", imagePath);
+		linphone_core_set_static_picture(theLinphoneCore, imagePath);
+	}
+
+	/*DETECT cameras*/
+	_frontCamId = _backCamId = nil;
+	char **camlist = (char **)linphone_core_get_video_devices(theLinphoneCore);
+	if (camlist) {
+		for (char *cam = *camlist; *camlist != NULL; cam = *++camlist) {
+			if (strcmp(FRONT_CAM_NAME, cam) == 0) {
+				_frontCamId = cam;
+				// great set default cam to front
+				LOGI(@"Setting default camera [%s]", _frontCamId);
+				linphone_core_set_video_device(theLinphoneCore, _frontCamId);
+			}
+			if (strcmp(BACK_CAM_NAME, cam) == 0) {
+				_backCamId = cam;
+			}
+		}
+	} else {
+		LOGW(@"No camera detected!");
+	}
+
+	if (![HDLLinphoneManager isNotIphone3G]) {
+		PayloadType *pt = linphone_core_find_payload_type(theLinphoneCore, "SILK", 24000, -1);
+		if (pt) {
+			linphone_core_enable_payload_type(theLinphoneCore, pt, FALSE);
+			LOGW(@"SILK/24000 and video disabled on old iPhone 3G");
+		}
+		linphone_core_enable_video_display(theLinphoneCore, FALSE);
+		linphone_core_enable_video_capture(theLinphoneCore, FALSE);
+	}
+
+	[self enableProxyPublish:([UIApplication sharedApplication].applicationState == UIApplicationStateActive)];
+
+	//update UserDefaults for widgets
+//	[HistoryListTableView saveDataToUserDefaults];
+
+	LOGI(@"Linphone [%s] started on [%s]", linphone_core_get_version(), [[UIDevice currentDevice].model UTF8String]);
+    NSLog(@"Linphone [%s] started on [%s]", linphone_core_get_version(), [[UIDevice currentDevice].model UTF8String]);
+
+	// Post event
+	NSDictionary *dict = [NSDictionary dictionaryWithObject:[NSValue valueWithPointer:theLinphoneCore] forKey:@"core"];
+
+	[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCoreUpdate
+	 object:HDLLinphoneManager.instance
+	 userInfo:dict];
+}
+
+static BOOL libStarted = FALSE;
+
+- (void)startLinphoneCore {
+
+	if (libStarted) {
+		LOGE(@"Liblinphone is already initialized!");
+		return;
+	}
+
+	libStarted = TRUE;
+
+	signal(SIGPIPE, SIG_IGN);
+
+	// create linphone core
+	[self createLinphoneCore];
+	[self.providerDelegate config];
+//	_iapManager = [[InAppProductsManager alloc] init];
+
+	// - Security fix - remove multi transport migration, because it enables tcp or udp, if by factoring settings only
+	// tls is enabled. 	This is a problem for new installations.
+	// linphone_core_migrate_to_multi_transport(theLinphoneCore);
+
+	// init audio session (just getting the instance will init)
+	AVAudioSession *audioSession = [AVAudioSession sharedInstance];
+	BOOL bAudioInputAvailable = audioSession.inputAvailable;
+	NSError *err = nil;
+
+	if (![audioSession setActive:NO error:&err] && err) {
+		NSLog(@"audioSession setActive failed: %@", [err description]);
+		err = nil;
+	}
+	if (!bAudioInputAvailable) {
+		UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"No microphone", nil)
+					      message:NSLocalizedString(@"You need to plug a microphone to your device to use the application.", nil)
+					      preferredStyle:UIAlertControllerStyleAlert];
+
+		UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
+						style:UIAlertActionStyleDefault
+						handler:^(UIAlertAction * action) {}];
+
+		[errView addAction:defaultAction];
+//		[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
+	}
+
+	if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
+		// go directly to bg mode
+		[self enterBackgroundMode];
+	}
+}
+
+void popup_link_account_cb(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, const char *resp) {
+	if (status == LinphoneAccountCreatorStatusAccountLinked) {
+		[HDLLinphoneManager.instance lpConfigSetInt:0 forKey:@"must_link_account_time"];
+	} else {
+		LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC);
+		if (cfg &&
+		    strcmp(linphone_proxy_config_get_domain(cfg),
+			   [HDLLinphoneManager.instance lpConfigStringForKey:@"domain_name"
+			    inSection:@"app"
+			    withDefault:@"sip.linphone.org"]
+			   .UTF8String) == 0) {
+			UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Link your account", nil)
+						      message:[NSString stringWithFormat:NSLocalizedString(@"Link your Linphone.org account %s to your phone number.", nil),
+							       linphone_address_get_username(linphone_proxy_config_get_identity_address(cfg))]
+						      preferredStyle:UIAlertControllerStyleAlert];
+
+			UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Maybe later", nil)
+							style:UIAlertActionStyleDefault
+							handler:^(UIAlertAction * action) {}];
+
+			UIAlertAction* continueAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"Let's go", nil)
+							 style:UIAlertActionStyleDefault
+							 handler:^(UIAlertAction * action) {
+//					[PhoneMainView.instance changeCurrentView:AssistantLinkView.compositeViewDescription];
+				}];
+			defaultAction.accessibilityLabel = @"Later";
+			[errView addAction:defaultAction];
+			[errView addAction:continueAction];
+//			[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
+
+			[HDLLinphoneManager.instance
+			 lpConfigSetInt:[[NSDate date] dateByAddingTimeInterval:[HDLLinphoneManager.instance
+										 lpConfigIntForKey:@"link_account_popup_time"
+										 withDefault:84200]]
+			 .timeIntervalSince1970
+			 forKey:@"must_link_account_time"];
+		}
+	}
+}
+
+- (void)shouldPresentLinkPopup {
+	NSDate *nextTime =
+		[NSDate dateWithTimeIntervalSince1970:[self lpConfigIntForKey:@"must_link_account_time" withDefault:1]];
+	NSDate *now = [NSDate date];
+	if (nextTime.timeIntervalSince1970 > 0 && [now earlierDate:nextTime] == nextTime) {
+		LinphoneProxyConfig *cfg = linphone_core_get_default_proxy_config(LC);
+		if (cfg) {
+			const char *username = linphone_address_get_username(linphone_proxy_config_get_identity_address(cfg));
+			LinphoneAccountCreator *account_creator = linphone_account_creator_new(
+											       LC,
+											       [HDLLinphoneManager.instance lpConfigStringForKey:@"xmlrpc_url" inSection:@"assistant" withDefault:@""]
+											       .UTF8String);
+			linphone_account_creator_set_user_data(account_creator, (__bridge void *)(self));
+			linphone_account_creator_cbs_set_is_account_linked(linphone_account_creator_get_callbacks(account_creator),
+									   popup_link_account_cb);
+			linphone_account_creator_set_username(account_creator, username);
+			linphone_account_creator_is_account_linked(account_creator);
+		}
+	}
+}
+
+- (void)createLinphoneCore {
+	[self migrationAllPre];
+	if (theLinphoneCore != nil) {
+		LOGI(@"linphonecore is already created");
+		return;
+	}
+
+
+	// Set audio assets
+	NSString *ring =
+		([HDLLinphoneManager bundleFile:[self lpConfigStringForKey:@"local_ring" inSection:@"sound"].lastPathComponent]
+		 ?: [HDLLinphoneManager bundleFile:@"notes_of_the_optimistic.caf"])
+		.lastPathComponent;
+	NSString *ringback =
+		([HDLLinphoneManager bundleFile:[self lpConfigStringForKey:@"remote_ring" inSection:@"sound"].lastPathComponent]
+		 ?: [HDLLinphoneManager bundleFile:@"ringback.wav"])
+		.lastPathComponent;
+	NSString *hold =
+		([HDLLinphoneManager bundleFile:[self lpConfigStringForKey:@"hold_music" inSection:@"sound"].lastPathComponent]
+		 ?: [HDLLinphoneManager bundleFile:@"hold.mkv"])
+		.lastPathComponent;
+	[self lpConfigSetString:[HDLLinphoneManager bundleFile:ring] forKey:@"local_ring" inSection:@"sound"];
+	[self lpConfigSetString:[HDLLinphoneManager bundleFile:ringback] forKey:@"remote_ring" inSection:@"sound"];
+	[self lpConfigSetString:[HDLLinphoneManager bundleFile:hold] forKey:@"hold_music" inSection:@"sound"];
+
+	LinphoneFactory *factory = linphone_factory_get();
+	LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(factory);
+	linphone_core_cbs_set_call_state_changed(cbs, linphone_iphone_call_state);
+	linphone_core_cbs_set_registration_state_changed(cbs,linphone_iphone_registration_state);
+	linphone_core_cbs_set_notify_presence_received_for_uri_or_tel(cbs, linphone_iphone_notify_presence_received_for_uri_or_tel);
+	linphone_core_cbs_set_authentication_requested(cbs, linphone_iphone_popup_password_request);
+	linphone_core_cbs_set_message_received(cbs, linphone_iphone_message_received);
+	linphone_core_cbs_set_message_received_unable_decrypt(cbs, linphone_iphone_message_received_unable_decrypt);
+	linphone_core_cbs_set_transfer_state_changed(cbs, linphone_iphone_transfer_state_changed);
+	linphone_core_cbs_set_is_composing_received(cbs, linphone_iphone_is_composing_received);
+	linphone_core_cbs_set_configuring_status(cbs, linphone_iphone_configuring_status_changed);
+	linphone_core_cbs_set_global_state_changed(cbs, linphone_iphone_global_state_changed);
+	linphone_core_cbs_set_notify_received(cbs, linphone_iphone_notify_received);
+	linphone_core_cbs_set_call_encryption_changed(cbs, linphone_iphone_call_encryption_changed);
+	linphone_core_cbs_set_chat_room_state_changed(cbs, linphone_iphone_chatroom_state_changed);
+	linphone_core_cbs_set_version_update_check_result_received(cbs, linphone_iphone_version_update_check_result_received);
+	linphone_core_cbs_set_qrcode_found(cbs, linphone_iphone_qr_code_found);
+	linphone_core_cbs_set_user_data(cbs, (__bridge void *)(self));
+
+	theLinphoneCore = linphone_factory_create_core_with_config_3(factory, _configDb, NULL);
+	linphone_core_add_callbacks(theLinphoneCore, cbs);
+	linphone_core_start(theLinphoneCore);
+
+    [self removeAllAccounts];
+	// Let the core handle cbs
+	linphone_core_cbs_unref(cbs);
+
+	NSLog(@"Create linphonecore %p", theLinphoneCore);
+
+    
+	// Load plugins if available in the linphone SDK - otherwise these calls will do nothing
+	MSFactory *f = linphone_core_get_ms_factory(theLinphoneCore);
+	libmssilk_init(f);
+	libmsamr_init(f);
+	libmsx264_init(f);
+	libmsopenh264_init(f);
+	libmswebrtc_init(f);
+	libmscodec2_init(f);
+
+	linphone_core_reload_ms_plugins(theLinphoneCore, NULL);
+	[self migrationAllPost];
+
+	/* Use the rootca from framework, which is already set*/
+	//linphone_core_set_root_ca(theLinphoneCore, [LinphoneManager bundleFile:@"rootca.pem"].UTF8String);
+	linphone_core_set_user_certificates_path(theLinphoneCore, [HDLLinphoneManager cacheDirectory].UTF8String);
+
+	/* The core will call the linphone_iphone_configuring_status_changed callback when the remote provisioning is loaded
+	   (or skipped).
+	   Wait for this to finish the code configuration */
+
+	[NSNotificationCenter.defaultCenter addObserver:self
+	 selector:@selector(audioSessionInterrupted:)
+	 name:AVAudioSessionInterruptionNotification
+	 object:nil];
+	[NSNotificationCenter.defaultCenter addObserver:self
+	 selector:@selector(globalStateChangedNotificationHandler:)
+	 name:kLinphoneGlobalStateUpdate
+	 object:nil];
+	[NSNotificationCenter.defaultCenter addObserver:self
+	 selector:@selector(configuringStateChangedNotificationHandler:)
+	 name:kLinphoneConfiguringStateUpdate
+	 object:nil];
+	[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(inappReady:) name:kIAPReady object:nil];
+    
+//    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillTerminate) name:UIApplicationWillTerminateNotification object:nil];
+
+	/*call iterate once immediately in order to initiate background connections with sip server or remote provisioning
+	 * grab, if any */
+	[self iterate];
+	// start scheduler
+	mIterateTimer =
+		[NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(iterate) userInfo:nil repeats:YES];
+}
+
+//-(void)appWillTerminate{
+//    NSLog(@"搴旂敤灏嗙粓姝�");
+//    [self removeAllAccounts];
+//}
+
+//-(void)removeAllAccounts{
+//
+//    const bctbx_list_t *accounts = linphone_core_get_proxy_config_list(theLinphoneCore);
+//    size_t count = bctbx_list_size(accounts);
+//    for (size_t i = 1; i <= count; i++, accounts = accounts->next) {
+//        LinphoneProxyConfig *config = (LinphoneProxyConfig *)accounts->data;
+//        if (config!=NULL) {
+//            //绉婚櫎config
+//            linphone_core_remove_proxy_config(theLinphoneCore, config);
+//            const LinphoneAuthInfo *ai = linphone_proxy_config_find_auth_info(config);
+//            if (ai) {
+//                    linphone_core_remove_auth_info(theLinphoneCore, ai);
+//            }
+//
+//        }
+//
+//    }
+//
+//}
+- (void)destroyLinphoneCore {
+	[mIterateTimer invalidate];
+	// just in case
+	[self removeCTCallCenterCb];
+
+	if (theLinphoneCore != nil) { // just in case application terminate before linphone core initialization
+
+//		for (FileTransferDelegate *ftd in _fileTransferDelegates) {
+//			[ftd stopAndDestroy];
+//		}
+		[_fileTransferDelegates removeAllObjects];
+
+		linphone_core_destroy(theLinphoneCore);
+		LOGI(@"Destroy linphonecore %p", theLinphoneCore);
+		theLinphoneCore = nil;
+
+		// Post event
+		NSDictionary *dict =
+			[NSDictionary dictionaryWithObject:[NSValue valueWithPointer:theLinphoneCore] forKey:@"core"];
+		[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCoreUpdate
+		 object:HDLLinphoneManager.instance
+		 userInfo:dict];
+	}
+	libStarted = FALSE;
+	[[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)resetLinphoneCore {
+	[self destroyLinphoneCore];
+	[self createLinphoneCore];
+	// reload friends
+//	[self.fastAddressBook fetchContactsInBackGroundThread];
+}
+
+static int comp_call_id(const LinphoneCall *call, const char *callid) {
+	if (linphone_call_log_get_call_id(linphone_call_get_call_log(call)) == nil) {
+		ms_error("no callid for call [%p]", call);
+		return 1;
+	}
+	return strcmp(linphone_call_log_get_call_id(linphone_call_get_call_log(call)), callid);
+}
+
+- (LinphoneCall *)callByCallId:(NSString *)call_id {
+	const bctbx_list_t *calls = linphone_core_get_calls(theLinphoneCore);
+	if (!calls || !call_id) {
+		return NULL;
+	}
+	bctbx_list_t *call_tmp = bctbx_list_find_custom(calls, (bctbx_compare_func)comp_call_id, [call_id UTF8String]);
+	if (!call_tmp) {
+		return NULL;
+	}
+	LinphoneCall *call = (LinphoneCall *)call_tmp->data;
+	return call;
+}
+
+- (void)cancelLocalNotifTimerForCallId:(NSString *)callid {
+	// first, make sure this callid is not already involved in a call
+	const bctbx_list_t *calls = linphone_core_get_calls(theLinphoneCore);
+	bctbx_list_t *call = bctbx_list_find_custom(calls, (bctbx_compare_func)comp_call_id, [callid UTF8String]);
+	if (call != NULL) {
+		LinphoneCallAppData *data =
+			(__bridge LinphoneCallAppData *)(linphone_call_get_user_data((LinphoneCall *)call->data));
+		if (data->timer)
+			[data->timer invalidate];
+		data->timer = nil;
+		return;
+	}
+}
+
+- (void)acceptCallForCallId:(NSString *)callid {
+	// first, make sure this callid is not already involved in a call
+	const bctbx_list_t *calls = linphone_core_get_calls(theLinphoneCore);
+	bctbx_list_t *call = bctbx_list_find_custom(calls, (bctbx_compare_func)comp_call_id, [callid UTF8String]);
+	if (call != NULL) {
+		const LinphoneVideoPolicy *video_policy = linphone_core_get_video_policy(theLinphoneCore);
+		bool with_video = video_policy->automatically_accept;
+		[self acceptCall:(LinphoneCall *)call->data evenWithVideo:with_video];
+		return;
+	};
+}
+
+- (void)addPushCallId:(NSString *)callid {
+	// first, make sure this callid is not already involved in a call
+	const bctbx_list_t *calls = linphone_core_get_calls(theLinphoneCore);
+	if (bctbx_list_find_custom(calls, (bctbx_compare_func)comp_call_id, [callid UTF8String])) {
+		LOGW(@"Call id [%@] already handled", callid);
+		return;
+	};
+	if ([pushCallIDs count] > 10 /*max number of pending notif*/)
+		[pushCallIDs removeObjectAtIndex:0];
+
+	[pushCallIDs addObject:callid];
+}
+
+- (BOOL)popPushCallID:(NSString *)callId {
+	for (NSString *pendingNotif in pushCallIDs) {
+		if ([pendingNotif compare:callId] == NSOrderedSame) {
+			[pushCallIDs removeObject:pendingNotif];
+			return TRUE;
+		}
+	}
+	return FALSE;
+}
+
+- (BOOL)resignActive {
+	linphone_core_stop_dtmf_stream(theLinphoneCore);
+
+	return YES;
+}
+
+- (void)playMessageSound {
+	BOOL success = [self.messagePlayer play];
+	if (!success) {
+		LOGE(@"Could not play the message sound");
+	}
+	AudioServicesPlaySystemSound(HDLLinphoneManager.instance.sounds.vibrate);
+}
+
+static int comp_call_state_paused(const LinphoneCall *call, const void *param) {
+	return linphone_call_get_state(call) != LinphoneCallPaused;
+}
+
+- (void)startCallPausedLongRunningTask {
+	pausedCallBgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
+			LOGW(@"Call cannot be paused any more, too late");
+			[[UIApplication sharedApplication] endBackgroundTask:pausedCallBgTask];
+		}];
+//	LOGI(@"Long running task started, remaining [%@] because at least one call is paused",
+//	     [LinphoneUtils intervalToString:[[UIApplication sharedApplication] backgroundTimeRemaining]]);
+}
+
+- (void)startPushLongRunningTask:(NSString *)loc_key callId:(NSString *)callId {
+	if (!callId)
+		return;
+
+	if ([callId isEqualToString:@""])
+		return;
+
+	if ([loc_key isEqualToString:@"IM_MSG"]) {
+		[[UIApplication sharedApplication] endBackgroundTask:pushBgTaskMsg];
+		pushBgTaskMsg = 0;
+		pushBgTaskMsg = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
+				if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
+					LOGW(@"Incomming message with call-id [%@] couldn't be received", callId);
+					UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
+					content.title = NSLocalizedString(@"Message received", nil);
+					content.body = NSLocalizedString(@"You have received a message.", nil);
+					content.categoryIdentifier = @"push_msg";
+
+					UNNotificationRequest *req =
+					[UNNotificationRequest requestWithIdentifier:@"push_msg" content:content trigger:NULL];
+					[[UNUserNotificationCenter currentNotificationCenter]
+					 addNotificationRequest:req
+					 withCompletionHandler:^(NSError *_Nullable error) {
+							// Enable or disable features based on authorization.
+							if (error) {
+								LOGD(@"Error while adding notification request :");
+								LOGD(error.description);
+							}
+						}];
+				}
+				for (NSString *key in [HDLLinphoneManager.instance.pushDict allKeys]) {
+					[HDLLinphoneManager.instance.pushDict setValue:[NSNumber numberWithInt:0] forKey:key];
+				}
+				[[UIApplication sharedApplication] endBackgroundTask:pushBgTaskMsg];
+				pushBgTaskMsg = 0;
+			}];
+//		LOGI(@"Message long running task started for call-id [%@], remaining [%@] because a push has been received",
+//		     callId, [LinphoneUtils intervalToString:[[UIApplication sharedApplication] backgroundTimeRemaining]]);
+	} else if ([loc_key isEqualToString:@"IC_MSG"]) {
+		[[UIApplication sharedApplication] endBackgroundTask:pushBgTaskCall];
+		pushBgTaskCall = 0;
+		pushBgTaskCall = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
+				//does not make sens to notify user as we have no information on this missed called
+				for (NSString *key in [HDLLinphoneManager.instance.pushDict allKeys]) {
+					[HDLLinphoneManager.instance.pushDict setValue:[NSNumber numberWithInt:0] forKey:key];
+				}
+				[[UIApplication sharedApplication] endBackgroundTask:pushBgTaskCall];
+				pushBgTaskCall = 0;
+			}];
+//		LOGI(@"Call long running task started for call-id [%@], remaining [%@] because a push has been received",
+//		     callId, [LinphoneUtils intervalToString:[[UIApplication sharedApplication] backgroundTimeRemaining]]);
+	} else if ([loc_key isEqualToString:@"IC_SIL"]) {
+		[[UIApplication sharedApplication] endBackgroundTask:pushBgTaskRefer];
+		pushBgTaskRefer = 0;
+		pushBgTaskRefer = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
+				// Could be or not an error since the app doesn't know when to end the background task for a REFER
+				// TODO: Manage pushes in the SDK
+				if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive)
+					LOGI(@"Incomming refer long running task with call-id [%@] has expired", callId);
+
+				for (NSString *key in [HDLLinphoneManager.instance.pushDict allKeys]) {
+					[HDLLinphoneManager.instance.pushDict setValue:[NSNumber numberWithInt:0] forKey:key];
+				}
+				[[UIApplication sharedApplication] endBackgroundTask:pushBgTaskRefer];
+				pushBgTaskRefer = 0;
+			}];
+//		LOGI(@"Refer long running task started for call-id [%@], remaining [%@] because a push has been received",
+//		     callId, [LinphoneUtils intervalToString:[[UIApplication sharedApplication] backgroundTimeRemaining]]);
+	}
+}
+
+- (void)enableProxyPublish:(BOOL)enabled {
+	if (linphone_core_get_global_state(LC) != LinphoneGlobalOn || !linphone_core_get_default_friend_list(LC)) {
+		LOGW(@"Not changing presence configuration because linphone core not ready yet");
+		return;
+	}
+
+	if ([self lpConfigBoolForKey:@"publish_presence"]) {
+		// set present to "tv", because "available" does not work yet
+		if (enabled) {
+			linphone_core_set_presence_model(LC, linphone_core_create_presence_model_with_activity(LC, LinphonePresenceActivityTV, NULL));
+		}
+
+		const MSList *proxies = linphone_core_get_proxy_config_list(LC);
+		while (proxies) {
+			LinphoneProxyConfig *cfg = proxies->data;
+			linphone_proxy_config_edit(cfg);
+			linphone_proxy_config_enable_publish(cfg, enabled);
+			linphone_proxy_config_done(cfg);
+			proxies = proxies->next;
+		}
+		// force registration update first, then update friend list subscription
+		[self iterate];
+	}
+
+	linphone_core_enable_friend_list_subscription(LC, enabled && [HDLLinphoneManager.instance lpConfigBoolForKey:@"use_rls_presence"]);
+}
+
+- (BOOL)enterBackgroundMode {
+	linphone_core_enter_background(LC);
+
+	LinphoneProxyConfig *proxyCfg = linphone_core_get_default_proxy_config(theLinphoneCore);
+	BOOL shouldEnterBgMode = FALSE;
+
+	// disable presence
+	[self enableProxyPublish:NO];
+
+	// handle proxy config if any
+	if (proxyCfg) {
+		const char *refkey = proxyCfg ? linphone_proxy_config_get_ref_key(proxyCfg) : NULL;
+		BOOL pushNotifEnabled = (refkey && strcmp(refkey, "push_notification") == 0);
+		if ([HDLLinphoneManager.instance lpConfigBoolForKey:@"backgroundmode_preference"] || pushNotifEnabled) {
+			if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+				// For registration register
+				[self refreshRegisters];
+			}
+		}
+
+		if ([HDLLinphoneManager.instance lpConfigBoolForKey:@"voip_mode_preference"] && [HDLLinphoneManager.instance lpConfigBoolForKey:@"backgroundmode_preference"] && !pushNotifEnabled) {
+            // Keep this!! Socket VoIP is deprecated after 9.0, but sometimes it's the only way to keep the phone background and receive the call. For example, when there is only local area network.
+            // register keepalive
+            if ([[UIApplication sharedApplication]
+                 setKeepAliveTimeout:600 /*(NSTimeInterval)linphone_proxy_config_get_expires(proxyCfg)*/
+                 handler:^{
+                     LOGW(@"keepalive handler");
+                     mLastKeepAliveDate = [NSDate date];
+                     if (theLinphoneCore == nil) {
+                         LOGW(@"It seems that Linphone BG mode was deactivated, just skipping");
+                         return;
+                     }
+//                     [_iapManager check];
+                     if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+                         // For registration register
+                         [self refreshRegisters];
+                     }
+                     linphone_core_iterate(theLinphoneCore);
+                 }]) {
+		     LOGI(@"keepalive handler succesfully registered");
+                 } else {
+                     LOGI(@"keepalive handler cannot be registered");
+                 }
+			shouldEnterBgMode = TRUE;
+		}
+	}
+
+	LinphoneCall *currentCall = linphone_core_get_current_call(theLinphoneCore);
+	const bctbx_list_t *callList = linphone_core_get_calls(theLinphoneCore);
+	if (!currentCall // no active call
+	    && callList  // at least one call in a non active state
+	    && bctbx_list_find_custom(callList, (bctbx_compare_func)comp_call_state_paused, NULL)) {
+		[self startCallPausedLongRunningTask];
+	}
+	if (callList) // If at least one call exist, enter normal bg mode
+		shouldEnterBgMode = TRUE;
+
+	// Stop the video preview
+	if (theLinphoneCore) {
+		linphone_core_enable_video_preview(theLinphoneCore, FALSE);
+		[self iterate];
+	}
+	linphone_core_stop_dtmf_stream(theLinphoneCore);
+
+	LOGI(@"Entering [%s] bg mode", shouldEnterBgMode ? "normal" : "lite");
+	if (!shouldEnterBgMode && floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+		const char *refkey = proxyCfg ? linphone_proxy_config_get_ref_key(proxyCfg) : NULL;
+		BOOL pushNotifEnabled = (refkey && strcmp(refkey, "push_notification") == 0);
+		if (pushNotifEnabled) {
+			LOGI(@"Keeping lc core to handle push");
+			return YES;
+		}
+		return NO;
+	}
+	return YES;
+}
+
+- (void)becomeActive {
+	linphone_core_enter_foreground(LC);
+
+	[self checkNewVersion];
+
+	// enable presence
+	if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+		[self refreshRegisters];
+	}
+	if (pausedCallBgTask) {
+		[[UIApplication sharedApplication] endBackgroundTask:pausedCallBgTask];
+		pausedCallBgTask = 0;
+	}
+	if (incallBgTask) {
+		[[UIApplication sharedApplication] endBackgroundTask:incallBgTask];
+		incallBgTask = 0;
+	}
+
+	/*IOS specific*/
+	linphone_core_start_dtmf_stream(theLinphoneCore);
+	[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo
+	 completionHandler:^(BOOL granted){
+		}];
+
+	/*start the video preview in case we are in the main view*/
+	if (linphone_core_video_display_enabled(theLinphoneCore) && [self lpConfigBoolForKey:@"preview_preference"]) {
+		linphone_core_enable_video_preview(theLinphoneCore, TRUE);
+	}
+	/*check last keepalive handler date*/
+	if (mLastKeepAliveDate != Nil) {
+		NSDate *current = [NSDate date];
+		if ([current timeIntervalSinceDate:mLastKeepAliveDate] > 700) {
+			NSString *datestr = [mLastKeepAliveDate description];
+			LOGW(@"keepalive handler was called for the last time at %@", datestr);
+		}
+	}
+
+	[self enableProxyPublish:YES];
+}
+
+- (void)beginInterruption {
+	LinphoneCall *c = linphone_core_get_current_call(theLinphoneCore);
+	LOGI(@"Sound interruption detected!");
+	if (c && linphone_call_get_state(c) == LinphoneCallStreamsRunning) {
+		_speakerBeforePause = _speakerEnabled;
+		linphone_call_pause(c);
+	}
+}
+
+- (void)endInterruption {
+	LOGI(@"Sound interruption ended!");
+}
+
+- (void)refreshRegisters {
+	linphone_core_refresh_registers(theLinphoneCore); // just to make sure REGISTRATION is up to date
+}
+
+- (void)migrateImportantFiles {
+    if ([HDLLinphoneManager copyFile:[HDLLinphoneManager documentFile:@"linphonerc"] destination:[HDLLinphoneManager preferenceFile:@"linphonerc"] override:TRUE ignore:TRUE])
+        [NSFileManager.defaultManager
+         removeItemAtPath:[HDLLinphoneManager documentFile:@"linphonerc"]
+         error:nil];
+    
+    if ([HDLLinphoneManager copyFile:[HDLLinphoneManager documentFile:@"linphone_chats.db"] destination:[HDLLinphoneManager dataFile:@"linphone_chats.db"] override:TRUE ignore:TRUE])
+        [NSFileManager.defaultManager
+         removeItemAtPath:[HDLLinphoneManager documentFile:@"linphone_chats.db"]
+         error:nil];
+    
+    if ([HDLLinphoneManager copyFile:[HDLLinphoneManager documentFile:@"zrtp_secrets"] destination:[HDLLinphoneManager dataFile:@"zrtp_secrets"] override:TRUE ignore:TRUE])
+        [NSFileManager.defaultManager
+         removeItemAtPath:[HDLLinphoneManager documentFile:@"zrtp_secrets"]
+         error:nil];
+    
+    if ([HDLLinphoneManager copyFile:[HDLLinphoneManager documentFile:@"zrtp_secrets.bkp"] destination:[HDLLinphoneManager dataFile:@"zrtp_secrets.bkp"] override:TRUE ignore:TRUE])
+        [NSFileManager.defaultManager
+         removeItemAtPath:[HDLLinphoneManager documentFile:@"zrtp_secrets.bkp"]
+         error:nil];
+}
+
+- (void)renameDefaultSettings {
+	// rename .linphonerc to linphonerc to ease debugging: when downloading
+	// containers from MacOSX, Finder do not display hidden files leading
+	// to useless painful operations to display the .linphonerc file
+	NSString *src = [HDLLinphoneManager documentFile:@".linphonerc"];
+	NSString *dst = [HDLLinphoneManager preferenceFile:@"linphonerc"];
+	NSFileManager *fileManager = [NSFileManager defaultManager];
+	NSError *fileError = nil;
+	if ([fileManager fileExistsAtPath:src]) {
+		if ([fileManager fileExistsAtPath:dst]) {
+			[fileManager removeItemAtPath:src error:&fileError];
+			LOGW(@"%@ already exists, simply removing %@ %@", dst, src,
+			     fileError ? fileError.localizedDescription : @"successfully");
+		} else {
+			[fileManager moveItemAtPath:src toPath:dst error:&fileError];
+			LOGI(@"%@ moving to %@ %@", dst, src, fileError ? fileError.localizedDescription : @"successfully");
+		}
+	}
+}
+
+- (void)copyDefaultSettings {
+	NSString *src = [HDLLinphoneManager bundleFile:@"linphonerc"];
+	NSString *srcIpad = [HDLLinphoneManager bundleFile:@"linphonerc~ipad"];
+	if (IPAD && [[NSFileManager defaultManager] fileExistsAtPath:srcIpad]) {
+		src = srcIpad;
+	}
+	NSString *dst = [HDLLinphoneManager preferenceFile:@"linphonerc"];
+	[HDLLinphoneManager copyFile:src destination:dst override:FALSE ignore:FALSE];
+}
+
+- (void)overrideDefaultSettings {
+	NSString *factory = [HDLLinphoneManager bundleFile:@"linphonerc-factory"];
+	NSString *factoryIpad = [HDLLinphoneManager bundleFile:@"linphonerc-factory~ipad"];
+//	if (IPAD && [[NSFileManager defaultManager] fileExistsAtPath:factoryIpad]) {
+//		factory = factoryIpad;
+//	}
+	NSString *confiFileName = [HDLLinphoneManager preferenceFile:@"linphonerc"];
+	_configDb = lp_config_new_with_factory([confiFileName UTF8String], [factory UTF8String]);
+}
+#pragma mark - Audio route Functions
+
+- (bool)allowSpeaker {
+//	if (IPAD)
+//		return true;
+
+	bool allow = true;
+	AVAudioSessionRouteDescription *newRoute = [AVAudioSession sharedInstance].currentRoute;
+	if (newRoute && newRoute.outputs.count > 0) {
+		NSString *route = newRoute.outputs[0].portType;
+		allow = !([route isEqualToString:AVAudioSessionPortLineOut] ||
+			  [route isEqualToString:AVAudioSessionPortHeadphones] ||
+			  [[HDLLinphoneAudioHelper bluetoothRoutes] containsObject:route]);
+	}
+	return allow;
+}
+
+- (void)audioRouteChangeListenerCallback:(NSNotification *)notif {
+	if (IPAD)
+		return;
+
+	// there is at least one bug when you disconnect an audio bluetooth headset
+	// since we only get notification of route having changed, we cannot tell if that is due to:
+	// -bluetooth headset disconnected or
+	// -user wanted to use earpiece
+	// the only thing we can assume is that when we lost a device, it must be a bluetooth one (strong hypothesis though)
+	if ([[notif.userInfo valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue] == AVAudioSessionRouteChangeReasonOldDeviceUnavailable)
+		_bluetoothAvailable = NO;
+
+	AVAudioSessionRouteDescription *newRoute = [AVAudioSession sharedInstance].currentRoute;
+
+	if (newRoute && newRoute.outputs.count > 0) {
+		NSString *route = newRoute.outputs[0].portType;
+		LOGI(@"Current audio route is [%s]", [route UTF8String]);
+
+		_speakerEnabled = [route isEqualToString:AVAudioSessionPortBuiltInSpeaker];
+		if (([[HDLLinphoneAudioHelper bluetoothRoutes] containsObject:route]) && !_speakerEnabled) {
+			_bluetoothAvailable = TRUE;
+			_bluetoothEnabled = TRUE;
+		} else
+			_bluetoothEnabled = FALSE;
+
+		NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:_bluetoothAvailable], @"available", nil];
+		[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneBluetoothAvailabilityUpdate
+		 object:self
+		 userInfo:dict];
+	}
+}
+
+- (void)setSpeakerEnabled:(BOOL)enable {
+	_speakerEnabled = enable;
+	NSError *err = nil;
+
+	if (enable && [self allowSpeaker]) {
+		[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&err];
+		[[UIDevice currentDevice] setProximityMonitoringEnabled:FALSE];
+		_bluetoothEnabled = FALSE;
+	} else {
+		AVAudioSessionPortDescription *builtinPort = [HDLLinphoneAudioHelper builtinAudioDevice];
+		[[AVAudioSession sharedInstance] setPreferredInput:builtinPort error:&err];
+		[[UIDevice currentDevice] setProximityMonitoringEnabled:(linphone_core_get_calls_nb(LC) > 0)];
+	}
+
+	if (err) {
+		LOGE(@"Failed to change audio route: err %@", err.localizedDescription);
+		err = nil;
+	}
+}
+
+- (void)setBluetoothEnabled:(BOOL)enable {
+	if (_bluetoothAvailable) {
+		// The change of route will be done in setSpeakerEnabled
+		_bluetoothEnabled = enable;
+		if (_bluetoothEnabled) {
+			NSError *err = nil;
+			AVAudioSessionPortDescription *_bluetoothPort = [HDLLinphoneAudioHelper bluetoothAudioDevice];
+			[[AVAudioSession sharedInstance] setPreferredInput:_bluetoothPort error:&err];
+			// if setting bluetooth failed, it must be because the device is not available
+			// anymore (disconnected), so deactivate bluetooth.
+			if (err) {
+				_bluetoothEnabled = FALSE;
+				LOGE(@"Failed to enable bluetooth: err %@", err.localizedDescription);
+				err = nil;
+			} else {
+				_speakerEnabled = FALSE;
+				return;
+			}
+		}
+	}
+	[self setSpeakerEnabled:_speakerEnabled];
+}
+
+#pragma mark - Call Functions
+
+- (void)acceptCall:(LinphoneCall *)call evenWithVideo:(BOOL)video {
+	LinphoneCallParams *lcallParams = linphone_core_create_call_params(theLinphoneCore, call);
+	if (!lcallParams) {
+		LOGW(@"Could not create call parameters for %p, call has probably already ended.", call);
+		return;
+	}
+
+	if ([self lpConfigBoolForKey:@"edge_opt_preference"]) {
+		bool low_bandwidth = self.network == network_2g;
+		if (low_bandwidth) {
+			LOGI(@"Low bandwidth mode");
+		}
+		linphone_call_params_enable_low_bandwidth(lcallParams, low_bandwidth);
+	}
+	linphone_call_params_enable_video(lcallParams, video);
+
+	//We set the record file name here because we can't do it after the call is started.
+//	NSString *writablePath = [LinphoneUtils recordingFilePathFromCall:linphone_call_log_get_from_address(linphone_call_get_call_log(call))];
+//	LOGD(@"record file path: %@\n", writablePath);
+    
+//	linphone_call_params_set_record_file(lcallParams, [writablePath cStringUsingEncoding:NSUTF8StringEncoding]);
+    
+	linphone_call_accept_with_params(call, lcallParams);
+	linphone_call_params_unref(lcallParams);
+}
+
+- (void)send:(NSString *)replyText toChatRoom:(LinphoneChatRoom *)room {
+	LinphoneChatMessage *msg = linphone_chat_room_create_message(room, replyText.UTF8String);
+	linphone_chat_room_send_chat_message(room, msg);
+
+	if (linphone_core_lime_enabled(LC) == LinphoneLimeMandatory && !linphone_chat_room_lime_available(room))
+		[HDLLinphoneManager.instance alertLIME:room];
+
+//	[ChatConversationView markAsRead:room];
+}
+
+- (void)call:(const LinphoneAddress *)iaddr {
+	// First verify that network is available, abort otherwise.
+	if (!linphone_core_is_network_reachable(theLinphoneCore)) {
+//		[PhoneMainView.instance presentViewController:[LinphoneUtils networkErrorView] animated:YES completion:nil];
+		return;
+	}
+
+	// Then check that no GSM calls are in progress, abort otherwise.
+	CTCallCenter *callCenter = [[CTCallCenter alloc] init];
+	if ([callCenter currentCalls] != nil && floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+		LOGE(@"GSM call in progress, cancelling outgoing SIP call request");
+		UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Cannot make call", nil)
+					      message:NSLocalizedString(@"Please terminate GSM call first.", nil)
+					      preferredStyle:UIAlertControllerStyleAlert];
+
+		UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
+						style:UIAlertActionStyleDefault
+						handler:^(UIAlertAction * action) {}];
+
+		[errView addAction:defaultAction];
+//		[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
+		return;
+	}
+
+	// Then check that the supplied address is valid
+	if (!iaddr) {
+		UIAlertController *errView = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Invalid SIP address", nil)
+					      message:NSLocalizedString(@"Either configure a SIP proxy server from settings prior to place a "
+									@"call or use a valid SIP address (I.E sip:john@example.net)", nil)
+					      preferredStyle:UIAlertControllerStyleAlert];
+
+		UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
+						style:UIAlertActionStyleDefault
+						handler:^(UIAlertAction * action) {}];
+
+		[errView addAction:defaultAction];
+//		[PhoneMainView.instance presentViewController:errView animated:YES completion:nil];
+		return;
+	}
+
+	if (linphone_core_get_calls_nb(theLinphoneCore) < 1 &&
+	    floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max &&
+	    self.providerDelegate.callKitCalls < 1) {
+        NSLog(@"杩涜繖閲屽懠鍙簡");
+		self.providerDelegate.callKitCalls++;
+		NSUUID *uuid = [NSUUID UUID];
+		[HDLLinphoneManager.instance.providerDelegate.uuids setObject:uuid forKey:@""];
+		[HDLLinphoneManager.instance.providerDelegate.calls setObject:@"" forKey:uuid];
+		HDLLinphoneManager.instance.providerDelegate.pendingAddr = linphone_address_clone(iaddr);
+//		NSString *address = [FastAddressBook displayNameForAddress:iaddr];
+        NSString *address =@"unknow";
+
+		CXHandle *handle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:address];
+		CXStartCallAction *act = [[CXStartCallAction alloc] initWithCallUUID:uuid handle:handle];
+		CXTransaction *tr = [[CXTransaction alloc] initWithAction:act];
+		[HDLLinphoneManager.instance.providerDelegate.controller requestTransaction:tr
+		 completion:^(NSError *err){
+            NSLog(@"鍛煎彨error:%@",err);
+			}];
+	} else {
+        NSLog(@"杩沝oCall鍛煎彨浜�");
+		[self doCall:iaddr];
+	}
+}
+
+- (BOOL)doCall:(const LinphoneAddress *)iaddr {
+	return [self doCallWithSas:iaddr isSas:false];
+}
+
+- (BOOL)doCallWithSas:(const LinphoneAddress *)iaddr isSas:(BOOL)isSas {
+	LinphoneAddress *addr = linphone_address_clone(iaddr);
+//	NSString *displayName = [FastAddressBook displayNameForAddress:addr];
+    
+    NSString *displayName=@"";
+    
+	// Finally we can make the call
+	LinphoneCallParams *lcallParams = linphone_core_create_call_params(theLinphoneCore, NULL);
+	if ([self lpConfigBoolForKey:@"edge_opt_preference"] && (self.network == network_2g)) {
+		LOGI(@"Enabling low bandwidth mode");
+		linphone_call_params_enable_low_bandwidth(lcallParams, YES);
+	}
+    
+	if (displayName != nil) {
+		linphone_address_set_display_name(addr, displayName.UTF8String);
+	}
+	if ([HDLLinphoneManager.instance lpConfigBoolForKey:@"override_domain_with_default_one"]) {
+		linphone_address_set_domain(
+					    addr, [[HDLLinphoneManager.instance lpConfigStringForKey:@"domain" inSection:@"assistant"] UTF8String]);
+	}
+    
+	LinphoneCall *call;
+	if (HDLLinphoneManager.instance.nextCallIsTransfer) {
+		char *caddr = linphone_address_as_string(addr);
+		call = linphone_core_get_current_call(theLinphoneCore);
+		linphone_call_transfer(call, caddr);
+		HDLLinphoneManager.instance.nextCallIsTransfer = NO;
+		ms_free(caddr);
+	} else {
+		//We set the record file name here because we can't do it after the call is started.
+//		NSString *writablePath = [LinphoneUtils recordingFilePathFromCall:addr];
+//		LOGD(@"record file path: %@\n", writablePath);
+//		linphone_call_params_set_record_file(lcallParams, [writablePath cStringUsingEncoding:NSUTF8StringEncoding]);
+		if (isSas)
+			linphone_call_params_set_media_encryption(lcallParams, LinphoneMediaEncryptionZRTP);
+        linphone_call_params_enable_video(lcallParams, YES);
+		call = linphone_core_invite_address_with_params(theLinphoneCore, addr, lcallParams);
+		if (call) {
+			// The LinphoneCallAppData object should be set on call creation with callback
+			// - (void)onCall:StateChanged:withMessage:. If not, we are in big trouble and expect it to crash
+			// We are NOT responsible for creating the AppData.
+			LinphoneCallAppData *data = (__bridge LinphoneCallAppData *)linphone_call_get_user_data(call);
+			if (data == nil) {
+				LOGE(@"New call instanciated but app data was not set. Expect it to crash.");
+				/* will be used later to notify user if video was not activated because of the linphone core*/
+			} else {
+				data->videoRequested = linphone_call_params_video_enabled(lcallParams);
+			}
+		}
+	}
+	linphone_address_destroy(addr);
+	linphone_call_params_destroy(lcallParams);
+    
+	return TRUE;
+}
+
+#pragma mark - Property Functions
+
+- (void)setPushNotificationToken:(NSData *)apushNotificationToken {
+	if (apushNotificationToken == _pushNotificationToken) {
+		return;
+	}
+	_pushNotificationToken = apushNotificationToken;
+
+	@try {
+		const MSList *proxies = linphone_core_get_proxy_config_list(LC);
+		while (proxies) {
+			[self configurePushTokenForProxyConfig:proxies->data];
+			proxies = proxies->next;
+		}
+	} @catch (NSException* e) {
+		LOGW(@"%s: linphone core not ready yet, ignoring push token", __FUNCTION__);
+	}
+}
+
+- (void)configurePushTokenForProxyConfig:(LinphoneProxyConfig *)proxyCfg {
+	linphone_proxy_config_edit(proxyCfg);
+
+	NSData *tokenData = _pushNotificationToken;
+	const char *refkey = linphone_proxy_config_get_ref_key(proxyCfg);
+	BOOL pushNotifEnabled = (refkey && strcmp(refkey, "push_notification") == 0);
+	if (tokenData != nil && pushNotifEnabled) {
+		const unsigned char *tokenBuffer = [tokenData bytes];
+		NSMutableString *tokenString = [NSMutableString stringWithCapacity:[tokenData length] * 2];
+		for (int i = 0; i < [tokenData length]; ++i) {
+			[tokenString appendFormat:@"%02X", (unsigned int)tokenBuffer[i]];
+		}
+		// NSLocalizedString(@"IC_MSG", nil); // Fake for genstrings
+		// NSLocalizedString(@"IM_MSG", nil); // Fake for genstrings
+		// NSLocalizedString(@"IM_FULLMSG", nil); // Fake for genstrings
+#ifdef DEBUG
+#define APPMODE_SUFFIX @"dev"
+#else
+#define APPMODE_SUFFIX @"prod"
+#endif
+		NSString *ring =
+			([HDLLinphoneManager bundleFile:[self lpConfigStringForKey:@"local_ring" inSection:@"sound"].lastPathComponent]
+			 ?: [HDLLinphoneManager bundleFile:@"notes_of_the_optimistic.caf"])
+			.lastPathComponent;
+
+		NSString *timeout;
+		if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
+			timeout = @";pn-timeout=0";
+		} else {
+			timeout = @"";
+		}
+
+		NSString *params = [NSString
+				    stringWithFormat:@"app-id=%@.voip.%@;pn-type=apple;pn-tok=%@;pn-msg-str=IM_MSG;pn-call-str=IC_MSG;pn-"
+				    @"call-snd=%@;pn-msg-snd=msg.caf%@;pn-silent=1",
+				    [[NSBundle mainBundle] bundleIdentifier], APPMODE_SUFFIX, tokenString, ring, timeout];
+
+		LOGI(@"Proxy config %s configured for push notifications with contact: %@",
+		     linphone_proxy_config_get_identity(proxyCfg), params);
+		linphone_proxy_config_set_contact_uri_parameters(proxyCfg, [params UTF8String]);
+		linphone_proxy_config_set_contact_parameters(proxyCfg, NULL);
+	} else {
+		LOGI(@"Proxy config %s NOT configured for push notifications", linphone_proxy_config_get_identity(proxyCfg));
+		// no push token:
+		linphone_proxy_config_set_contact_uri_parameters(proxyCfg, NULL);
+		linphone_proxy_config_set_contact_parameters(proxyCfg, NULL);
+	}
+
+	linphone_proxy_config_done(proxyCfg);
+}
+
+#pragma mark - Misc Functions
++ (PHFetchResult *)getPHAssets:(NSString *)key {
+	PHFetchResult<PHAsset *> *assets;
+	if ([key hasPrefix:@"assets-library"]) {
+		// compability with previous linphone version
+		assets = [PHAsset fetchAssetsWithALAssetURLs:@[[NSURL URLWithString:key]] options:nil];
+	} else {
+		assets = [PHAsset fetchAssetsWithLocalIdentifiers:[NSArray arrayWithObject:key] options:nil];
+	}
+	return assets;
+}
+
++ (NSString *)bundleFile:(NSString *)file {
+	return [[NSBundle mainBundle] pathForResource:[file stringByDeletingPathExtension] ofType:[file pathExtension]];
+}
+
++ (NSString *)documentFile:(NSString *)file {
+	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
+	NSString *documentsPath = [paths objectAtIndex:0];
+	return [documentsPath stringByAppendingPathComponent:file];
+}
+
++ (NSString *)preferenceFile:(NSString *)file {
+	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
+	NSString *writablePath = [paths objectAtIndex:0];
+	NSString *fullPath = [writablePath stringByAppendingString:@"/Preferences/linphone/"];
+	if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) {
+		NSError *error;
+		LOGI(@"Preference path %@ does not exist, creating it.",fullPath);
+		if (![[NSFileManager defaultManager] createDirectoryAtPath:fullPath
+		      withIntermediateDirectories:YES
+		      attributes:nil
+		      error:&error]) {
+			LOGE(@"Create preference path directory error: %@",error.description);
+		}
+	}
+    
+	return [fullPath stringByAppendingPathComponent:file];
+}
+
++ (NSString *)dataFile:(NSString *)file {
+	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
+	NSString *writablePath = [paths objectAtIndex:0];
+	NSString *fullPath = [writablePath stringByAppendingString:@"/linphone/"];
+	if (![[NSFileManager defaultManager] fileExistsAtPath:fullPath]) {
+		NSError *error;
+		LOGI(@"Data path %@ does not exist, creating it.",fullPath);
+		if (![[NSFileManager defaultManager] createDirectoryAtPath:fullPath
+		      withIntermediateDirectories:YES
+		      attributes:nil
+		      error:&error]) {
+			LOGE(@"Create data path directory error: %@",error.description);
+		}
+	}
+    
+	return [fullPath stringByAppendingPathComponent:file];
+}
+
++ (NSString *)cacheDirectory {
+	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
+	NSString *cachePath = [paths objectAtIndex:0];
+	BOOL isDir = NO;
+	NSError *error;
+	// cache directory must be created if not existing
+	if (![[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDir] && isDir == NO) {
+		[[NSFileManager defaultManager] createDirectoryAtPath:cachePath
+		 withIntermediateDirectories:NO
+		 attributes:nil
+		 error:&error];
+	}
+	return cachePath;
+}
+
++ (int)unreadMessageCount {
+	int count = 0;
+	const MSList *rooms = linphone_core_get_chat_rooms(LC);
+	const MSList *item = rooms;
+	while (item) {
+		LinphoneChatRoom *room = (LinphoneChatRoom *)item->data;
+		if (room) {
+			count += linphone_chat_room_get_unread_messages_count(room);
+		}
+		item = item->next;
+	}
+
+	return count;
+}
+
++ (BOOL)copyFile:(NSString *)src destination:(NSString *)dst override:(BOOL)override ignore:(BOOL)ignore {
+	NSFileManager *fileManager = NSFileManager.defaultManager;
+	NSError *error = nil;
+	if ([fileManager fileExistsAtPath:src] == NO) {
+		if (!ignore)
+			LOGE(@"Can't find \"%@\": %@", src, [error localizedDescription]);
+		return FALSE;
+	}
+	if ([fileManager fileExistsAtPath:dst] == YES) {
+		if (override) {
+			[fileManager removeItemAtPath:dst error:&error];
+			if (error != nil) {
+				LOGE(@"Can't remove \"%@\": %@", dst, [error localizedDescription]);
+				return FALSE;
+			}
+		} else {
+			LOGW(@"\"%@\" already exists", dst);
+			return FALSE;
+		}
+	}
+	[fileManager copyItemAtPath:src toPath:dst error:&error];
+	if (error != nil) {
+		LOGE(@"Can't copy \"%@\" to \"%@\": %@", src, dst, [error localizedDescription]);
+		return FALSE;
+	}
+	return TRUE;
+}
+
+- (void)configureVbrCodecs {
+	PayloadType *pt;
+	int bitrate = lp_config_get_int(
+					_configDb, "audio", "codec_bitrate_limit",
+					kLinphoneAudioVbrCodecDefaultBitrate); /*default value is in linphonerc or linphonerc-factory*/
+	const MSList *audio_codecs = linphone_core_get_audio_codecs(theLinphoneCore);
+	const MSList *codec = audio_codecs;
+	while (codec) {
+		pt = codec->data;
+		if (linphone_core_payload_type_is_vbr(theLinphoneCore, pt)) {
+			linphone_core_set_payload_type_bitrate(theLinphoneCore, pt, bitrate);
+		}
+		codec = codec->next;
+	}
+}
+
++ (id)getMessageAppDataForKey:(NSString *)key inMessage:(LinphoneChatMessage *)msg {
+
+	if (msg == nil)
+		return nil;
+
+	id value = nil;
+	const char *appData = linphone_chat_message_get_appdata(msg);
+	if (appData) {
+		NSDictionary *appDataDict =
+			[NSJSONSerialization JSONObjectWithData:[NSData dataWithBytes:appData length:strlen(appData)]
+			 options:0
+			 error:nil];
+		value = [appDataDict objectForKey:key];
+	}
+	return value;
+}
+
++ (void)setValueInMessageAppData:(id)value forKey:(NSString *)key inMessage:(LinphoneChatMessage *)msg {
+        NSMutableDictionary *appDataDict = [NSMutableDictionary dictionary];
+        const char *appData = linphone_chat_message_get_appdata(msg);
+        if (appData) {
+		appDataDict = [NSJSONSerialization JSONObjectWithData:[NSData dataWithBytes:appData length:strlen(appData)]
+			       options:NSJSONReadingMutableContainers
+			       error:nil];
+        }
+
+        [appDataDict setValue:value forKey:key];
+
+        NSData *data = [NSJSONSerialization dataWithJSONObject:appDataDict options:0 error:nil];
+        NSString *appdataJSON = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+        linphone_chat_message_set_appdata(msg, [appdataJSON UTF8String]);
+}
+
+#pragma mark - LPConfig Functions
+
+- (void)lpConfigSetString:(NSString *)value forKey:(NSString *)key {
+	[self lpConfigSetString:value forKey:key inSection:LINPHONERC_APPLICATION_KEY];
+}
+- (void)lpConfigSetString:(NSString *)value forKey:(NSString *)key inSection:(NSString *)section {
+	if (!key)
+		return;
+	lp_config_set_string(_configDb, [section UTF8String], [key UTF8String], value ? [value UTF8String] : NULL);
+}
+- (NSString *)lpConfigStringForKey:(NSString *)key {
+	return [self lpConfigStringForKey:key withDefault:nil];
+}
+- (NSString *)lpConfigStringForKey:(NSString *)key withDefault:(NSString *)defaultValue {
+	return [self lpConfigStringForKey:key inSection:LINPHONERC_APPLICATION_KEY withDefault:defaultValue];
+}
+- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section {
+	return [self lpConfigStringForKey:key inSection:section withDefault:nil];
+}
+- (NSString *)lpConfigStringForKey:(NSString *)key inSection:(NSString *)section withDefault:(NSString *)defaultValue {
+	if (!key)
+		return defaultValue;
+	const char *value = lp_config_get_string(_configDb, [section UTF8String], [key UTF8String], NULL);
+	return value ? [NSString stringWithUTF8String:value] : defaultValue;
+}
+
+- (void)lpConfigSetInt:(int)value forKey:(NSString *)key {
+	[self lpConfigSetInt:value forKey:key inSection:LINPHONERC_APPLICATION_KEY];
+}
+- (void)lpConfigSetInt:(int)value forKey:(NSString *)key inSection:(NSString *)section {
+	if (!key)
+		return;
+	lp_config_set_int(_configDb, [section UTF8String], [key UTF8String], (int)value);
+}
+- (int)lpConfigIntForKey:(NSString *)key {
+	return [self lpConfigIntForKey:key withDefault:-1];
+}
+- (int)lpConfigIntForKey:(NSString *)key withDefault:(int)defaultValue {
+	return [self lpConfigIntForKey:key inSection:LINPHONERC_APPLICATION_KEY withDefault:defaultValue];
+}
+- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section {
+	return [self lpConfigIntForKey:key inSection:section withDefault:-1];
+}
+- (int)lpConfigIntForKey:(NSString *)key inSection:(NSString *)section withDefault:(int)defaultValue {
+	if (!key)
+		return defaultValue;
+	return lp_config_get_int(_configDb, [section UTF8String], [key UTF8String], (int)defaultValue);
+}
+
+- (void)lpConfigSetBool:(BOOL)value forKey:(NSString *)key {
+	[self lpConfigSetBool:value forKey:key inSection:LINPHONERC_APPLICATION_KEY];
+}
+- (void)lpConfigSetBool:(BOOL)value forKey:(NSString *)key inSection:(NSString *)section {
+	[self lpConfigSetInt:(int)(value == TRUE) forKey:key inSection:section];
+}
+- (BOOL)lpConfigBoolForKey:(NSString *)key {
+	return [self lpConfigBoolForKey:key withDefault:FALSE];
+}
+- (BOOL)lpConfigBoolForKey:(NSString *)key withDefault:(BOOL)defaultValue {
+	return [self lpConfigBoolForKey:key inSection:LINPHONERC_APPLICATION_KEY withDefault:defaultValue];
+}
+- (BOOL)lpConfigBoolForKey:(NSString *)key inSection:(NSString *)section {
+	return [self lpConfigBoolForKey:key inSection:section withDefault:FALSE];
+}
+- (BOOL)lpConfigBoolForKey:(NSString *)key inSection:(NSString *)section withDefault:(BOOL)defaultValue {
+	if (!key)
+		return defaultValue;
+	int val = [self lpConfigIntForKey:key inSection:section withDefault:-1];
+	return (val != -1) ? (val == 1) : defaultValue;
+}
+
+#pragma mark - GSM management
+
+- (void)removeCTCallCenterCb {
+	if (mCallCenter != nil) {
+		LOGI(@"Removing CT call center listener [%p]", mCallCenter);
+		mCallCenter.callEventHandler = NULL;
+	}
+	mCallCenter = nil;
+}
+
+- (void)setupGSMInteraction {
+
+	[self removeCTCallCenterCb];
+	mCallCenter = [[CTCallCenter alloc] init];
+	LOGI(@"Adding CT call center listener [%p]", mCallCenter);
+	__block __weak HDLLinphoneManager *weakSelf = self;
+	__block __weak CTCallCenter *weakCCenter = mCallCenter;
+	mCallCenter.callEventHandler = ^(CTCall *call) {
+		// post on main thread
+		[weakSelf performSelectorOnMainThread:@selector(handleGSMCallInteration:)
+		 withObject:weakCCenter
+		 waitUntilDone:YES];
+	};
+}
+
+- (void)handleGSMCallInteration:(id)cCenter {
+	if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_9_x_Max) {
+		CTCallCenter *ct = (CTCallCenter *)cCenter;
+		// pause current call, if any
+		LinphoneCall *call = linphone_core_get_current_call(theLinphoneCore);
+		if ([ct currentCalls] != nil) {
+			if (call) {
+				LOGI(@"Pausing SIP call because GSM call");
+				_speakerBeforePause = _speakerEnabled;
+				linphone_call_pause(call);
+				[self startCallPausedLongRunningTask];
+			} else if (linphone_core_is_in_conference(theLinphoneCore)) {
+				LOGI(@"Leaving conference call because GSM call");
+				linphone_core_leave_conference(theLinphoneCore);
+				[self startCallPausedLongRunningTask];
+			}
+		} // else nop, keep call in paused state
+	}
+}
+
+- (NSString *)contactFilter {
+	NSString *filter = @"*";
+	if ([self lpConfigBoolForKey:@"contact_filter_on_default_domain"]) {
+		LinphoneProxyConfig *proxy_cfg = linphone_core_get_default_proxy_config(theLinphoneCore);
+		if (proxy_cfg && linphone_proxy_config_get_addr(proxy_cfg)) {
+			return [NSString stringWithCString:linphone_proxy_config_get_domain(proxy_cfg)
+				encoding:[NSString defaultCStringEncoding]];
+		}
+	}
+	return filter;
+}
+
+#pragma mark - InApp Purchase events
+
+- (void)inappReady:(NSNotification *)notif {
+	// Query our in-app server to retrieve InApp purchases
+	//[_iapManager retrievePurchases];
+}
+
+#pragma mark -
+
+- (void)removeAllAccounts {
+	linphone_core_clear_proxy_config(LC);
+	linphone_core_clear_all_auth_info(LC);
+}
+
++ (BOOL)isMyself:(const LinphoneAddress *)addr {
+	if (!addr)
+		return NO;
+
+	const MSList *it = linphone_core_get_proxy_config_list(LC);
+	while (it) {
+		if (linphone_address_weak_equal(addr, linphone_proxy_config_get_identity_address(it->data))) {
+			return YES;
+		}
+		it = it->next;
+	}
+	return NO;
+}
+
+// ugly hack to export symbol from liblinphone so that they are available for the linphoneTests target
+// linphoneTests target do not link with liblinphone but instead dynamically link with ourself which is
+// statically linked with liblinphone, so we must have exported required symbols from the library to
+// have them available in linphoneTests
+// DO NOT INVOKE THIS METHOD
+- (void)exportSymbolsForUITests {
+	linphone_address_set_header(NULL, NULL, NULL);
+}
+
+- (void)checkNewVersion {
+//	if (!CHECK_VERSION_UPDATE)
+//		return;
+	if (theLinphoneCore == nil)
+		return;
+	NSString *curVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
+	const char *curVersionCString = [curVersion cStringUsingEncoding:NSUTF8StringEncoding];
+	linphone_core_check_for_update(theLinphoneCore, curVersionCString);
+}
+
+- (void)loadAvatar {
+	NSString *assetId = [self lpConfigStringForKey:@"avatar"];
+	__block UIImage *ret = nil;
+	if (assetId) {
+		PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsWithLocalIdentifiers:[NSArray arrayWithObject:assetId] options:nil];
+		if (![assets firstObject]) {
+			LOGE(@"Can't fetch avatar image.");
+		}
+		PHAsset *asset = [assets firstObject];
+		// load avatar synchronously so that we can return UIIMage* directly - since we are
+		// only using thumbnail, it must be pretty fast to fetch even without cache.
+		PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
+		options.synchronous = TRUE;
+		[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options
+		 resultHandler:^(UIImage *image, NSDictionary * info) {
+				if (image)
+//					ret = [UIImage UIImageThumbnail:image thumbSize:150];
+                    ret = [self UIImageThumbnail:image thumbSize:150];
+
+				else
+					LOGE(@"Can't read avatar");
+			}];
+	}
+
+	if (!ret) {
+		ret = [UIImage imageNamed:@"avatar.png"];
+	}
+	_avatar = ret;
+}
+
+
+-(UIImage *)UIImageThumbnail:(UIImage *)image thumbSize:(CGFloat) tbSize {
+    // Create a thumbnail version of the image for the event object.
+    CGSize size = image.size;
+    CGSize croppedSize;
+    CGFloat offsetX = 0.0;
+    CGFloat offsetY = 0.0;
+    CGFloat actualTbSize = MAX(tbSize, MAX(size.height, size.width));
+    // check the size of the image, we want to make it
+    // a square with sides the size of the smallest end
+    if (size.width > size.height) {
+        offsetX = (size.height - size.width) / 2;
+        croppedSize = CGSizeMake(size.height, size.height);
+    } else {
+        offsetY = (size.width - size.height) / 2;
+        croppedSize = CGSizeMake(size.width, size.width);
+    }
+    
+    // Crop the image before resize
+    CGRect clippedRect = CGRectMake(offsetX * -1,
+                                    offsetY * -1,
+                                    croppedSize.width,
+                                    croppedSize.height);
+    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage],
+                                                       clippedRect);
+    
+    UIImage *cropped = [UIImage imageWithCGImage:imageRef];
+    CGImageRelease(imageRef);
+    // Done cropping
+    
+    // Resize the image
+    CGRect rect = CGRectMake(0, 0, actualTbSize, actualTbSize);
+    
+    UIGraphicsBeginImageContext(rect.size);
+    [cropped drawInRect:rect];
+    UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext();
+    UIGraphicsEndImageContext();
+    // Done Resizing
+    
+    return thumbnail;
+}
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.h"
new file mode 100644
index 0000000..43c3137
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.h"
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone 
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import <CallKit/CallKit.h>
+#include <linphone/core.h>
+#ifndef ProviderDelegate_h
+#define ProviderDelegate_h
+
+@interface HDLLinphoneProviderDelegate : NSObject <CXProviderDelegate, CXCallObserverDelegate>
+
+@property CXProvider *provider;
+@property CXCallObserver *observer;
+@property CXCallController *controller;
+@property NSMutableDictionary *calls;
+@property NSMutableDictionary *uuids;
+@property(nonatomic) LinphoneCall *pendingCall;
+@property LinphoneAddress *pendingAddr;
+@property BOOL pendingCallVideo;
+@property int callKitCalls;
+
+- (void)reportIncomingCall:(LinphoneCall *) call withUUID:(NSUUID *)uuid handle:(NSString *)handle video:(BOOL)video;
+- (void)config;
+- (void)configAudioSession:(AVAudioSession *)audioSession;
+@end
+
+#endif /* ProviderDelegate_h */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m"
new file mode 100644
index 0000000..36ef23d
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m"
@@ -0,0 +1,303 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import "HDLLinphoneProviderDelegate.h"
+#import "HDLLinphoneManager.h"
+//#import "PhoneMainView.h"
+#include "linphone/linphonecore.h"
+#import <AVFoundation/AVAudioSession.h>
+#import <Foundation/Foundation.h>
+
+#define LC ([HDLLinphoneManager getLc])
+@implementation HDLLinphoneProviderDelegate
+
+- (instancetype)init {
+    NSLog(@"ProviderDelegate鍒濆鍖栦簡");
+	self = [super init];
+	self.calls = [[NSMutableDictionary alloc] init];
+	self.uuids = [[NSMutableDictionary alloc] init];
+	self.pendingCall = NULL;
+	self.pendingAddr = NULL;
+	self.pendingCallVideo = FALSE;
+	CXCallController *callController = [[CXCallController alloc] initWithQueue:dispatch_get_main_queue()];
+	[callController.callObserver setDelegate:self queue:dispatch_get_main_queue()];
+	self.controller = callController;
+	self.callKitCalls = 0;
+
+	if (!self) {
+		NSLog(@"ProviderDelegate not initialized...");
+	}
+	return self;
+}
+
+- (void)config {
+	CXProviderConfiguration *config = [[CXProviderConfiguration alloc]
+		initWithLocalizedName:[NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]];
+	config.ringtoneSound = @"notes_of_the_optimistic.caf";
+	config.supportsVideo = TRUE;
+	config.iconTemplateImageData = UIImagePNGRepresentation([UIImage imageNamed:@"callkit_logo"]);
+
+	NSArray *ar = @[ [NSNumber numberWithInt:(int)CXHandleTypeGeneric] ];
+	NSSet *handleTypes = [[NSSet alloc] initWithArray:ar];
+	[config setSupportedHandleTypes:handleTypes];
+	[config setMaximumCallGroups:2];
+	[config setMaximumCallsPerCallGroup:1];
+	//not show app's calls in tel's history
+	//config.includesCallsInRecents = NO;
+	self.provider = [[CXProvider alloc] initWithConfiguration:config];
+	[self.provider setDelegate:self queue:dispatch_get_main_queue()];
+}
+
+- (void)configAudioSession:(AVAudioSession *)audioSession {
+	NSError *err = nil;
+	[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
+                         mode:AVAudioSessionModeVoiceChat
+                      options:AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionAllowBluetoothA2DP
+						error:&err];
+	if (err) {
+//		LOGE(@"Unable to change audio session because: %@", err.localizedDescription);
+		err = nil;
+	}
+	[audioSession setMode:AVAudioSessionModeVoiceChat error:&err];
+	if (err) {
+//		LOGE(@"Unable to change audio mode because : %@", err.localizedDescription);
+		err = nil;
+	}
+	double sampleRate = 48000.0;
+	[audioSession setPreferredSampleRate:sampleRate error:&err];
+	if (err) {
+//		LOGE(@"Unable to change preferred sample rate because : %@", err.localizedDescription);
+		err = nil;
+	}
+}
+
+- (void)reportIncomingCall:(LinphoneCall *) call withUUID:(NSUUID *)uuid handle:(NSString *)handle video:(BOOL)video; {
+	// Create update to describe the incoming call and caller
+	CXCallUpdate *update = [[CXCallUpdate alloc] init];
+	update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle];
+	update.supportsDTMF = TRUE;
+	update.supportsHolding = TRUE;
+	update.supportsGrouping = TRUE;
+	update.supportsUngrouping = TRUE;
+	update.hasVideo = _pendingCallVideo = video;
+
+	// Report incoming call to system
+//    LOGD(@"CallKit: report new incoming call with call-id: [%@] and UUID: [%@]", [_calls objectForKey:uuid], uuid);
+	[self.provider reportNewIncomingCallWithUUID:uuid
+										  update:update
+									  completion:^(NSError *error) {
+										  if (error) {
+//											  LOGE(@"CallKit: cannot complete incoming call with call-id: [%@] and UUID: [%@] from [%@] caused by [%@]",
+//                                                   [_calls objectForKey:uuid], uuid, handle, [error localizedDescription]);
+											  if ([error code] == CXErrorCodeIncomingCallErrorFilteredByDoNotDisturb ||
+												  [error code] == CXErrorCodeIncomingCallErrorFilteredByBlockList)
+												  linphone_call_decline(call,LinphoneReasonBusy); /*to give a chance for other devices to answer*/
+											  else
+												  linphone_call_decline(call,LinphoneReasonUnknown);
+										  }
+									  }];
+}
+
+- (void)setPendingCall:(LinphoneCall *)pendingCall {
+	if (pendingCall) {
+		_pendingCall = pendingCall;
+        if (_pendingCall)
+            linphone_call_ref(_pendingCall);
+	} else if (_pendingCall) {
+        linphone_call_unref(_pendingCall);
+		_pendingCall = NULL;
+	}
+}
+
+#pragma mark - CXProviderDelegate Protocol
+
+- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action {
+    NSUUID *uuid = action.callUUID;
+    NSString *callID = [self.calls objectForKey:uuid]; // first, make sure this callid is not already involved in a call
+//	LOGD(@"CallKit: Answering call with call-id: [%@] and UUID: [%@]", callID, uuid);
+	[self configAudioSession:[AVAudioSession sharedInstance]];
+	[action fulfill];
+	LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID];
+	if (!call)
+		return;
+
+	self.callKitCalls++;
+    self.pendingCall = call;
+}
+
+- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action {
+    NSUUID *uuid = action.callUUID;
+    NSString *callID = [self.calls objectForKey:uuid]; // first, make sure this callid is not already involved in a call
+	NSLog(@"CallKit: Starting Call with call-id: [%@] and UUID: [%@]", callID, uuid);
+	// To restart Audio Unit
+	[self configAudioSession:[AVAudioSession sharedInstance]];
+	[action fulfill];
+	LinphoneCall *call;
+	if (![callID isEqualToString:@""]) {
+		call = linphone_core_get_current_call(LC);
+	} else {
+		call = [HDLLinphoneManager.instance callByCallId:callID];
+	}
+	if (call != NULL) {
+        self.callKitCalls++;
+		self.pendingCall = call;
+	}
+}
+
+- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action {
+	self.callKitCalls--;
+	[action fulfill];
+	if (linphone_core_is_in_conference(LC)) {
+		HDLLinphoneManager.instance.conf = TRUE;
+		linphone_core_terminate_conference(LC);
+//        LOGD(@"CallKit: Ending the conference");
+	} else if (linphone_core_get_calls_nb(LC) > 1) {
+		HDLLinphoneManager.instance.conf = TRUE;
+		linphone_core_terminate_all_calls(LC);
+//        LOGD(@"CallKit: Ending all the ongoing calls");
+	} else {
+		NSUUID *uuid = action.callUUID;
+		NSString *callID = [self.calls objectForKey:uuid];
+		if (callID) {
+//            LOGD(@"CallKit: Ending the call with call-id: [%@] and UUID: [%@]", callID, uuid);
+			LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID];
+			if (call) {
+				linphone_call_terminate((LinphoneCall *)call);
+			}
+			[self.uuids removeObjectForKey:callID];
+			[self.calls removeObjectForKey:uuid];
+		}
+	}
+}
+
+- (void)provider:(CXProvider *)provider performSetMutedCallAction:(nonnull CXSetMutedCallAction *)action {
+	[action fulfill];
+//	if ([[PhoneMainView.instance currentView] equal:CallView.compositeViewDescription]) {
+//		CallView *view = (CallView *)[PhoneMainView.instance popToView:CallView.compositeViewDescription];
+//		[view.microButton toggle];
+//	}
+}
+
+- (void)provider:(CXProvider *)provider performSetHeldCallAction:(nonnull CXSetHeldCallAction *)action {
+	[action fulfill];
+	if (linphone_core_is_in_conference(LC) && action.isOnHold) {
+		linphone_core_leave_conference(LC);
+//        LOGD(@"CallKit: Leaving conference");
+		[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self];
+		return;
+	}
+
+	if (linphone_core_get_calls_nb(LC) > 1 && action.isOnHold) {
+		linphone_core_pause_all_calls(LC);
+//        LOGD(@"CallKit: Pausing all ongoing calls");
+		return;
+	}
+
+	NSUUID *uuid = action.callUUID;
+	NSString *callID = [self.calls objectForKey:uuid];
+	if (!callID) {
+		return;
+	}
+
+//    LOGD(@"CallKit: Call  with call-id: [%@] and UUID: [%@] paused status changed to: []", callID, uuid, action.isOnHold ? @"Paused" : @"Resumed");
+	LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID];
+	if (!call)
+        return;
+
+	if (action.isOnHold) {
+		HDLLinphoneManager.instance.speakerBeforePause = HDLLinphoneManager.instance.speakerEnabled;
+		linphone_call_pause((LinphoneCall *)call);
+	} else {
+		if (linphone_core_get_conference(LC)) {
+			linphone_core_enter_conference(LC);
+			[NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self];
+		} else {
+			[self configAudioSession:[AVAudioSession sharedInstance]];
+			self.pendingCall = call;
+		}
+	}
+}
+
+- (void)provider:(CXProvider *)provider performPlayDTMFCallAction:(CXPlayDTMFCallAction *)action {
+	[action fulfill];
+	NSUUID *uuid = action.callUUID;
+	NSString *callID = [self.calls objectForKey:uuid];
+//    LOGD(@"CallKit: playing DTMF for call with call-id: [%@] and UUID: [%@]", callID, uuid);
+	LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID];
+	char digit = action.digits.UTF8String[0];
+	linphone_call_send_dtmf((LinphoneCall *)call, digit);
+}
+
+- (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession {
+	NSLog(@"CallKit: Audio session activated");
+	// Now we can (re)start the call
+	if (self.pendingCall) {
+		LinphoneCallState state = linphone_call_get_state(self.pendingCall);
+		switch (state) {
+			case LinphoneCallIncomingReceived:
+				[HDLLinphoneManager.instance acceptCall:(LinphoneCall *)self.pendingCall evenWithVideo:_pendingCallVideo];
+				break;
+			case LinphoneCallPaused:
+				linphone_call_resume((LinphoneCall *)self.pendingCall);
+				break;
+			case LinphoneCallStreamsRunning:
+				// May happen when multiple calls
+				break;
+			default:
+				break;
+		}
+	} else {
+		if (_pendingAddr) {
+			[HDLLinphoneManager.instance doCall:_pendingAddr];
+		} else {
+//			LOGE(@"CallKit: No pending call");
+		}
+	}
+
+    [self setPendingCall:NULL];
+	if (_pendingAddr)
+		linphone_address_unref(_pendingAddr);
+	_pendingAddr = NULL;
+	_pendingCallVideo = FALSE;
+}
+
+- (void)provider:(CXProvider *)provider didDeactivateAudioSession:(nonnull AVAudioSession *)audioSession {
+	NSLog(@"CallKit : Audio session deactivated");
+    [self setPendingCall:NULL];
+	if (_pendingAddr)
+		linphone_address_unref(_pendingAddr);
+	_pendingAddr = NULL;
+	_pendingCallVideo = FALSE;
+}
+
+- (void)providerDidReset:(CXProvider *)provider {
+//	LOGD(@"CallKit: Provider reset");
+	HDLLinphoneManager.instance.conf = TRUE;
+	linphone_core_terminate_all_calls(LC);
+	[self.calls removeAllObjects];
+	[self.uuids removeAllObjects];
+}
+
+#pragma mark - CXCallObserverDelegate Protocol
+
+- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call {
+	NSLog(@"CallKit: Call changed");
+}
+
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneUtlis.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneUtlis.h"
new file mode 100644
index 0000000..3175427
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneUtlis.h"
@@ -0,0 +1,51 @@
+//
+//  HDLLinphoneUtlis.h
+//  VoipTest
+//
+//  Created by 闄堝槈涔� on 2021/8/2.
+//
+
+#import <Foundation/Foundation.h>
+
+// APP Screen
+#define APP_SCREEN_BOUNDS   [[UIScreen mainScreen] bounds]
+#define APP_SCREEN_HEIGHT   (APP_SCREEN_BOUNDS.size.height)
+#define APP_SCREEN_WIDTH    (APP_SCREEN_BOUNDS.size.width)
+#define APP_STATUS_FRAME    [UIApplication sharedApplication].statusBarFrame
+// 鏄惁鏄疘PhoneX鐨勮澶�
+#define IPhoneX ([UIApplication sharedApplication].statusBarFrame.size.height >= 44)
+#define APP_TOP_BAR_HEIGHT    (IPhoneX ? 88 : 64)
+#define APP_STATUS_BAR_HEIGHT (IPhoneX ? 44 : 20)
+#define APP_TOOL_BAR_HEIGHT   49
+#define APP_TAB_BAR_HEIGHT    (IPhoneX ? (49 + 34): 49)
+#define APP_TAB_BOTTOM_HEIGHT (IPhoneX ? 34 : 0)
+#define APP_CONTENT_WIDTH     (APP_SCREEN_BOUNDS.size.width)
+#define APP_CONTENT_HEIGHT    (APP_SCREEN_HEIGHT - APP_TOP_BAR_HEIGHT - APP_TAB_BAR_HEIGHT)
+#define APP_VISIBLE_HEIGHT    (APP_SCREEN_HEIGHT - APP_TOP_BAR_HEIGHT - APP_TAB_BOTTOM_HEIGHT)
+#define APP_CONTENT_HEIGHT_2  (APP_SCREEN_HEIGHT - APP_STATUS_BAR_HEIGHT - APP_TAB_BAR_HEIGHT)
+
+#define APP_UIFont            @"PingFangSC-Regular"
+#define APP_UIFont_BOLD       @"PingFangSC-Semibold"
+
+
+#define DesignWidth 375
+#define DesignHeight 667
+#define GetRealWidth(W)  W / (DesignWidth * 1.0f / APP_SCREEN_WIDTH)
+#define GetRealHeight(H)  H / (DesignHeight * 1.0f / APP_SCREEN_HEIGHT)
+
+
+#define TextColor    HEXCOLORA(0x1B2D4D, 1.0)
+#define TextSelectColor    HEXCOLORA(0x4484F4, 1.0)
+/** WEAKSELF_AT */
+#define WEAKSELF_AT __weak __typeof(&*self)weakSelf_AT = self;
+#define HEXCOLORA(rgbValue, a) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16)) / 255.0 green:((float)((rgbValue & 0xFF00) >> 8)) / 255.0 blue:((float)(rgbValue & 0xFF)) / 255.0 alpha:a]
+
+#define RTSP_Result_String(enum) [@[ @"0", @"1", @"2", @"3", @"4", @"5", @"6", @"7", @"99", @"100" ] objectAtIndex:enum]
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HDLLinphoneUtlis : NSObject
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/IASKSettingsStore.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/IASKSettingsStore.m"
new file mode 100755
index 0000000..db858fa
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/IASKSettingsStore.m"
@@ -0,0 +1,68 @@
+//
+//  IASKSettingsStore.m
+//  http://www.inappsettingskit.com
+//
+//  Copyright (c) 2010:
+//  Luc Vandal, Edovia Inc., http://www.edovia.com
+//  Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com
+//  Marc-Etienne M.L茅veill茅, Edovia Inc., http://www.edovia.com
+//  All rights reserved.
+// 
+//  It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, 
+//  as the original authors of this code. You can give credit in a blog post, a tweet or on 
+//  a info page of your app. Also, the original authors appreciate letting them know if you use this code.
+//
+//  This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php
+//
+
+#import "IASKSettingsStore.h"
+
+@implementation IASKAbstractSettingsStore
+
+- (void)setObject:(id)value forKey:(NSString*)key {
+    [NSException raise:@"Unimplemented"
+                format:@"setObject:forKey: must be implemented in subclasses of IASKAbstractSettingsStore"];
+}
+
+- (id)objectForKey:(NSString*)key {
+    [NSException raise:@"Unimplemented"
+                format:@"objectForKey: must be implemented in subclasses of IASKAbstractSettingsStore"];
+    return nil;
+}
+
+- (void)setBool:(BOOL)value forKey:(NSString*)key {
+    [self setObject:[NSNumber numberWithBool:value] forKey:key];
+}
+
+- (void)setFloat:(float)value forKey:(NSString*)key {
+    [self setObject:[NSNumber numberWithFloat:value] forKey:key];
+}
+
+- (void)setInteger:(int)value forKey:(NSString*)key {
+    [self setObject:[NSNumber numberWithInt:value] forKey:key];
+}
+
+- (void)setDouble:(double)value forKey:(NSString*)key {
+    [self setObject:[NSNumber numberWithDouble:value] forKey:key];
+}
+
+- (BOOL)boolForKey:(NSString*)key {
+    return [[self objectForKey:key] boolValue];
+}
+
+- (float)floatForKey:(NSString*)key {
+    return [[self objectForKey:key] floatValue];
+}
+- (int)integerForKey:(NSString*)key {
+    return [[self objectForKey:key] intValue];
+}
+
+- (double)doubleForKey:(NSString*)key {
+    return [[self objectForKey:key] doubleValue];
+}
+
+- (BOOL)synchronize {
+    return NO;
+}
+
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinPhoneWraper.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinPhoneWraper.h"
new file mode 100644
index 0000000..d937a94
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinPhoneWraper.h"
@@ -0,0 +1,638 @@
+//
+//  LinPhoneWraper.h
+//  HDLLinPhoneSDK
+//
+//  Created by 闄堝惎鎵� on 2021/8/12.
+//  Copyright 漏 2021 闄堝惎鎵�. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import <belle-sip/object.h>
+#import <linphone/core.h>
+NS_ASSUME_NONNULL_BEGIN
+
+typedef enum _AVPFMode {
+
+    Default = -1,
+/// AVPF is disabled.
+    Disabled = 0,
+/// AVPF is enabled.
+     Enabled = 1
+    
+} AVPFMode;
+
+///Enum algorithm checking.
+typedef enum _AccountCreatorAlgoStatus {
+
+    Ok = 0,
+    /// Algorithm not supported.
+    NotSupported = 1
+    
+} AccountCreatorAlgoStatus;
+///Enum describing Ip family.
+typedef enum _AddressFamily {
+
+    Inet = 0,
+    /// IpV6.
+    Inet6 = 1,
+    /// Unknown.
+    Unspec = 2
+    
+} AddressFamily;
+
+///Enum describing type of audio route.
+typedef enum _AudioRoute {
+
+    Earpiece = 0,
+    Speaker = 1
+} AudioRoute;
+///Enum describing the authentication methods.
+typedef enum _AuthMethod {
+
+    /// Digest authentication requested.
+    HttpDigest = 0,
+    /// Client certificate requested.
+    Tls = 1
+} AuthMethod;
+
+///LinphoneChatRoomBackend is used to indicate the backend implementation of a
+///chat room.
+//typedef enum _ChatRoomBackend{
+//
+//   Basic = 0x01 << 0,
+//   FlexisipChat = 0x01 << 1
+//}ChatRoomBackend;
+//
+//typedef enum _ChatRoomCapabilities{
+//
+//   None = 0x1 << 0,
+//   Basic = 0x01 << 1
+//}ChatRoomCapabilities;
+typedef NS_OPTIONS(NSUInteger, ChatRoomBackend) {
+
+    ChatRoomBackend_Basic = 0x01 << 0,
+    ChatRoomBackend_FlexisipChat = 0x01 << 1
+
+};
+typedef NS_OPTIONS(NSUInteger, ChatRoomCapabilities) {
+
+    ChatRoomCapabilities_None = 0x00,
+    ChatRoomCapabilities_Basic = 0x01 << 0,
+    ChatRoomCapabilities_RealTimeText = 0x01 << 1,
+    ChatRoomCapabilities_Conference = 0x01 << 2,
+    ChatRoomCapabilities_Proxy = 0x01 << 3,
+    ChatRoomCapabilities_Migratable = 0x01 << 4,
+    ChatRoomCapabilities_OneToOne = 0x01 << 5,
+    ChatRoomCapabilities_Encrypted = 0x01 << 6
+    
+};
+
+///LinphoneChatRoomEncryptionBackend is used to indicate the encryption engine
+///used by a chat room.
+typedef NS_OPTIONS(NSUInteger, ChatRoomEncryptionBackend) {
+
+    ChatRoomEncryptionBackend_None = 0x00,
+    ChatRoomEncryptionBackend_Lime = 0x01 << 0,
+
+    
+};
+
+///TODO move to encryption engine object when available
+///LinphoneChatRoomSecurityLevel is used to indicate the encryption security level
+///of a chat room.
+typedef NS_ENUM(NSInteger,ChatRoomSecurityLevel) {
+    Unsafe = 0,
+    /// No encryption.
+    ClearText = 1,
+    /// Encrypted.
+    Encrypted = 2,
+    /// Encrypted and verified.
+    Safe = 3
+};
+
+///LinphoneGlobalState describes the global state of the `Core` object.
+typedef NS_ENUM(NSInteger,ConfiguringState) {
+    Successful = 0,
+    Failed = 1,
+    Skipped = 2
+};
+///Consolidated presence information: 'online' means the user is open for
+///communication, 'busy' means the user is open for communication but involved in
+///an other activity, 'do not disturb' means the user is not open for
+///communication, and 'offline' means that no presence information is available.
+typedef NS_ENUM(NSInteger,ConsolidatedPresence) {
+    Online = 0,
+    Busy = 1,
+    DoNotDisturb = 2,
+    Offline = 3
+    
+};
+
+///Enum describing the result of the echo canceller calibration process.
+typedef NS_ENUM(NSInteger,EcCalibratorStatus) {
+    /// The echo canceller calibration process is on going.
+    InProgress = 0,
+    /// The echo canceller calibration has been performed and produced an echo delay
+    /// measure.
+    Done = 1,
+    /// The echo canceller calibration process has failed.
+    EcCalibratorStatus_Failed = 2,
+    /// The echo canceller calibration has been performed and no echo has been
+    /// detected.
+    DoneNoEcho = 3
+
+    
+};
+
+///LinphoneEventLogType is used to indicate the type of an event.
+typedef NS_ENUM(NSInteger,EventLogType) {
+    /// No defined event.
+    None = 0,
+    /// Conference (created) event.
+    ConferenceCreated = 1,
+    /// Conference (terminated) event.
+    ConferenceTerminated = 2,
+    /// Conference call (start) event.
+    ConferenceCallStart = 3,
+    /// Conference call (end) event.
+    ConferenceCallEnd = 4,
+    /// Conference chat message event.
+    ConferenceChatMessage = 5,
+    /// Conference participant (added) event.
+    ConferenceParticipantAdded = 6,
+    /// Conference participant (removed) event.
+    ConferenceParticipantRemoved = 7,
+    /// Conference participant (set admin) event.
+    ConferenceParticipantSetAdmin = 8,
+    /// Conference participant (unset admin) event.
+    ConferenceParticipantUnsetAdmin = 9,
+    /// Conference participant device (added) event.
+    ConferenceParticipantDeviceAdded = 10,
+    /// Conference participant device (removed) event.
+    ConferenceParticipantDeviceRemoved = 11,
+    /// Conference subject event.
+    ConferenceSubjectChanged = 12,
+    /// Conference encryption security event.
+    ConferenceSecurityEvent = 13,
+    /// Conference ephemeral message (ephemeral message lifetime changed) event.
+    ConferenceEphemeralMessageLifetimeChanged = 14,
+    /// Conference ephemeral message (ephemeral message enabled) event.
+    ConferenceEphemeralMessageEnabled = 15,
+    /// Conference ephemeral message (ephemeral message disabled) event.
+    ConferenceEphemeralMessageDisabled = 16
+    
+};
+
+typedef NS_OPTIONS(NSUInteger, FriendCapability) {
+
+    FriendCapability_None = 0x00,
+    FriendCapability_GroupChat = 0x01 << 0,
+    FriendCapability_LimeX3Dh = 0x01 << 1,
+    FriendCapability_EphemeralMessages = 0x01 << 2
+    
+};
+
+///LinphoneGlobalState describes the global state of the `Core` object.
+typedef NS_ENUM(NSInteger,GlobalState) {
+    /// State in which we're in after {@link Core#stop}.
+    Off = 0,
+    /// Transient state for when we call {@link Core#start}
+    Startup = 1,
+    /// Indicates `Core` has been started and is up and running.
+    On = 2,
+    /// Transient state for when we call {@link Core#stop}
+    Shutdown = 3,
+    /// Transient state between Startup and On if there is a remote provisionning URI
+    /// configured.
+    Configuring = 4,
+    /// `Core` state after being created by linphone_factory_create_core, generally
+    /// followed by a call to {@link Core#start}
+    Ready = 5
+    
+};
+
+///Enum describing ICE states.
+typedef NS_ENUM(NSInteger,IceState) {
+    /// ICE has not been activated for this call or stream.
+    NotActivated = 0,
+    /// ICE processing has failed.
+    IceState_Failed = 1,
+    /// ICE process is in progress.
+    IceState_InProgress = 2,
+    /// ICE has established a direct connection to the remote host.
+    HostConnection = 3,
+    /// ICE has established a connection to the remote host through one or several
+    /// NATs.
+    ReflexiveConnection = 4,
+    /// ICE has established a connection through a relay.
+    RelayConnection = 5
+    
+};
+
+typedef NS_ENUM(NSInteger,LimeState) {
+    /// Lime is not used at all.
+    LimeState_Disabled = 0,
+    /// Lime is always used.
+    Mandatory = 1,
+    /// Lime is used only if we already shared a secret with remote.
+    Preferred = 2
+    
+};
+
+typedef NS_ENUM(NSInteger,LogCollectionState) {
+    LogCollectionState_Disabled = 0,
+    LogCollectionState_Enabled = 1,
+    EnabledWithoutPreviousLogHandler = 2
+};
+
+///Verbosity levels of log messages.
+typedef NS_OPTIONS(NSUInteger, LogLevel) {
+
+    LogLevel_Debug = 0x01,
+    LogLevel_Trace = 0x01 << 1,
+    LogLevel_Message = 0x01 << 2,
+    LogLevel_Warning = 0x01 << 3,
+    LogLevel_Error = 0x01 << 4,
+    LogLevel_Fatal = 0x01 << 5
+};
+
+///Indicates for a given media the stream direction.
+typedef NS_ENUM(NSInteger,MediaDirection) {
+     Invalid = -1,
+     Inactive = 0,
+    /// No active media not supported yet.
+     SendOnly = 1,
+    /// Send only mode.
+     RecvOnly = 2,
+    /// recv only mode
+     SendRecv = 3,
+};
+
+///Enum describing type of media encryption types.
+typedef NS_ENUM(NSInteger,MediaEncryption) {
+     /// No media encryption is used.
+      MediaEncryption_None = 0,
+     /// Use SRTP media encryption.
+      SRTP = 1,
+     /// Use ZRTP media encryption.
+      ZRTP = 2,
+     /// Use DTLS media encryption.
+      DTLS = 3,
+
+};
+
+///Activities as defined in section 3.2 of RFC 4480.
+typedef NS_ENUM(NSInteger,PresenceActivityType) {
+     /// The person has a calendar appointment, without specifying exactly of what type.
+      Appointment = 0,
+     /// The person is physically away from all interactive communication devices.
+      Away = 1,
+     /// The person is eating the first meal of the day, usually eaten in the morning.
+      Breakfast = 2,
+     /// The person is busy, without further details.
+      PresenceActivityType_Busy = 3,
+     /// The person is having his or her main meal of the day, eaten in the evening or
+     /// at midday.
+      Dinner = 4,
+     /// This is a scheduled national or local holiday.
+      Holiday = 5,
+     /// The person is riding in a vehicle, such as a car, but not steering.
+      InTransit = 6,
+     /// The person is looking for (paid) work.
+      LookingForWork = 7,
+     /// The person is eating his or her midday meal.
+      Lunch = 8,
+     /// The person is scheduled for a meal, without specifying whether it is breakfast,
+     /// lunch, or dinner, or some other meal.
+      Meal = 9,
+     /// The person is in an assembly or gathering of people, as for a business, social,
+     /// or religious purpose.
+      Meeting = 10,
+     /// The person is talking on the telephone.
+      OnThePhone = 11,
+     /// The person is engaged in an activity with no defined representation.
+      Other = 12,
+     /// A performance is a sub-class of an appointment and includes musical,
+     /// theatrical, and cinematic performances as well as lectures.
+      Performance = 13,
+     /// The person will not return for the foreseeable future, e.g., because it is no
+     /// longer working for the company.
+      PermanentAbsence = 14,
+     /// The person is occupying himself or herself in amusement, sport, or other
+     /// recreation.
+      Playing = 15,
+     /// The person is giving a presentation, lecture, or participating in a formal
+     /// round-table discussion.
+      Presentation = 16,
+     /// The person is visiting stores in search of goods or services.
+      Shopping = 17,
+     /// The person is sleeping.
+      Sleeping = 18,
+     /// The person is observing an event, such as a sports event.
+      Spectator = 19,
+     /// The person is controlling a vehicle, watercraft, or plane.
+      Steering = 20,
+     /// The person is on a business or personal trip, but not necessarily in-transit.
+      Travel = 21,
+     /// The person is watching television.
+      TV = 22,
+     /// The activity of the person is unknown.
+      Unknown = 23,
+     /// A period of time devoted to pleasure, rest, or relaxation.
+      Vacation = 24,
+     /// The person is engaged in, typically paid, labor, as part of a profession or
+     /// job.
+      Working = 25,
+     /// The person is participating in religious rites.
+      Worship = 26
+
+};
+
+///Basic status as defined in section 4.1.4 of RFC 3863.
+typedef NS_ENUM(NSInteger,PresenceBasicStatus) {
+     /// This value means that the associated contact element, if any, is ready to
+     /// accept communication.
+      Open = 0,
+     /// This value means that the associated contact element, if any, is unable to
+     /// accept communication.
+      Closed = 1
+};
+
+typedef NS_ENUM(NSInteger,Privacy) {
+     /// Privacy services must not perform any privacy function.
+      Privacy_None = 0,
+     /// Request that privacy services provide a user-level privacy function.
+      User = 1,
+     /// Request that privacy services modify headers that cannot be set arbitrarily by
+     /// the user (Contact/Via).
+      Header = 2,
+     /// Request that privacy services provide privacy for session media.
+      Session = 4,
+     /// rfc3325 The presence of this privacy type in a Privacy header field indicates
+     /// that the user would like the Network Asserted Identity to be kept private with
+     /// respect to SIP entities outside the Trust Domain with which the user
+     /// authenticated.
+      Id = 8,
+     /// Privacy service must perform the specified services or fail the request.
+      Critical = 16,
+     /// Special keyword to use privacy as defined either globally or by proxy using
+     /// {@link ProxyConfig#setPrivacy}
+      Privacy_Default = 32768
+};
+
+///Enum for publish states.
+typedef NS_ENUM(NSInteger,PublishState) {
+     /// Initial state, do not use.
+      PublishState_None = 0,
+     /// An outgoing publish was created and submitted.
+      Progress = 1,
+     /// Publish is accepted.
+      PublishState_Ok = 2,
+     /// Publish encoutered an error, {@link Event#getReason} gives reason code.
+      Error = 3,
+     /// Publish is about to expire, only sent if [sip]->refresh_generic_publish
+     /// property is set to 0.
+      Expiring = 4,
+     /// Event has been un published.
+      Cleared = 5
+};
+
+///Enum describing various failure reasons or contextual information for some
+///events.
+typedef NS_ENUM(NSInteger,Reason) {
+     /// No reason has been set by the core.
+      Reason_None = 0,
+     /// No response received from remote.
+      NoResponse = 1,
+     /// Authentication failed due to bad credentials or resource forbidden.
+      Forbidden = 2,
+     /// The call has been declined.
+      Declined = 3,
+     /// Destination of the call was not found.
+      NotFound = 4,
+     /// The call was not answered in time (request timeout)
+      NotAnswered = 5,
+     /// Phone line was busy.
+      Reason_Busy = 6,
+     /// Unsupported content.
+      UnsupportedContent = 7,
+     /// Transport error: connection failures, disconnections etc...
+      IOError = 8,
+     /// Do not disturb reason.
+      Reason_DoNotDisturb = 9,
+     /// Operation is unauthorized because missing credential.
+      Unauthorized = 10,
+     /// Operation is rejected due to incompatible or unsupported media parameters.
+      NotAcceptable = 11,
+     /// Operation could not be executed by server or remote client because it didn't
+     /// have any context for it.
+      NoMatch = 12,
+     /// Resource moved permanently.
+      MovedPermanently = 13,
+     /// Resource no longer exists.
+      Gone = 14,
+     /// Temporarily unavailable.
+      TemporarilyUnavailable = 15,
+     /// Address incomplete.
+      AddressIncomplete = 16,
+     /// Not implemented.
+      NotImplemented = 17,
+     /// Bad gateway.
+      BadGateway = 18,
+     /// The received request contains a Session-Expires header field with a duration
+     /// below the minimum timer.
+      SessionIntervalTooSmall = 19,
+     /// Server timeout.
+      ServerTimeout = 20,
+     /// Unknown reason.
+      Reason_Unknown = 21
+};
+
+///LinphoneRegistrationState describes proxy registration states.
+typedef NS_ENUM(NSInteger,RegistrationState) {
+     /// Initial state for registrations.
+      RegistrationState_None = 0,
+     /// Registration is in progress.
+      RegistrationState_Progress = 1,
+     /// Registration is successful.
+      RegistrationState_Ok = 2,
+     /// Unregistration succeeded.
+      RegistrationState_Cleared = 3,
+     /// Registration failed.
+      RegistrationState_Failed = 4
+};
+///LinphoneSecurityEventType is used to indicate the type of security event.
+typedef NS_ENUM(NSInteger,SecurityEventType) {
+     /// Event is not a security event.
+      SecurityEventType_None = 0,
+     /// Chatroom security level downgraded event.
+      SecurityLevelDowngraded = 1,
+     /// Participant has exceeded the maximum number of device event.
+      ParticipantMaxDeviceCountExceeded = 2,
+     /// Peer device instant messaging encryption identity key has changed event.
+      EncryptionIdentityKeyChanged = 3,
+     /// Man in the middle detected event.
+      ManInTheMiddleDetected = 4,
+};
+
+///Session Timers refresher.
+typedef NS_ENUM(NSInteger,SessionExpiresRefresher) {
+    Unspecified = 0,
+    UAS = 1,
+    UAC = 2
+    
+};
+
+
+///Enum describing the stream types.
+typedef NS_ENUM(NSInteger,StreamType) {
+     Audio = 0,
+     Video = 1,
+     Text = 2,
+     StreamType_Unknown = 3
+    
+};
+
+
+///Enum controlling behavior for incoming subscription request.
+typedef NS_ENUM(NSInteger,SubscribePolicy) {
+     /// Does not automatically accept an incoming subscription request.
+      SPWait = 0,
+     /// Rejects incoming subscription request.
+      SPDeny = 1,
+     /// Automatically accepts a subscription request.
+      SPAccept = 2
+};
+
+///Enum for subscription direction (incoming or outgoing).
+typedef NS_ENUM(NSInteger,SubscriptionDir) {
+     /// Incoming subscription.
+      Incoming = 0,
+     /// Outgoing subscription.
+      Outgoing = 1,
+     /// Invalid subscription direction.
+      InvalidDir = 2
+};
+
+
+///Enum for subscription states.
+typedef NS_ENUM(NSInteger,SubscriptionState) {
+     /// Initial state, should not be used.
+      SubscriptionState_None = 0,
+     /// An outgoing subcription was sent.
+      SubscriptionState_OutgoingProgress = 1,
+     /// An incoming subcription is received.
+      SubscriptionState_IncomingReceived = 2,
+     /// Subscription is pending, waiting for user approval.
+      SubscriptionState_Pending = 3,
+     /// Subscription is accepted.
+      SubscriptionState_Active = 4,
+     /// Subscription is terminated normally.
+      SubscriptionState_Terminated = 5,
+     /// Subscription was terminated by an error, indicated by {@link Event#getReason}
+      SubscriptionState_Error = 6,
+     /// Subscription is about to expire, only sent if [sip]->refresh_generic_subscribe
+     /// property is set to 0.
+      SubscriptionState_Expiring = 7
+};
+
+///Enum listing frequent telephony tones.
+typedef NS_ENUM(NSInteger,ToneID) {
+     /// Not a tone.
+      Undefined = 0,
+     /// Busy tone.
+      ToneID_Busy = 1,
+      CallWaiting = 2,
+     /// Call waiting tone.
+      CallOnHold = 3,
+     /// Call on hold tone.
+      CallLost = 4
+    
+};
+
+
+///Enum describing transport type for LinphoneAddress.
+typedef NS_ENUM(NSInteger,TransportType) {
+      Udp = 0,
+      Tcp = 1,
+      TransportType_Tls = 2,
+      Dtls = 3
+};
+
+///Enum describing uPnP states.
+typedef NS_ENUM(NSInteger,UpnpState) {
+      /// uPnP is not activate
+       Idle = 0,
+      /// uPnP process is in progress
+       Pending = 1,
+      /// Internal use: Only used by port binding.
+       Adding = 2,
+      /// Internal use: Only used by port binding.
+       Removing = 3,
+      /// uPnP is not available
+       NotAvailable = 4,
+      /// uPnP is enabled
+       UpnpState_Ok = 5,
+      /// uPnP processing has failed
+       Ko = 6,
+      /// IGD router is blacklisted.
+       Blacklisted = 7
+
+};
+
+///Enum describing the result of a version update check.
+typedef NS_ENUM(NSInteger,VersionUpdateCheckResult) {
+   UpToDate = 0,
+   NewVersionAvailable = 1,
+   VersionUpdateCheckResult_Error = 2
+    
+};
+
+///Enum describing the types of argument for LinphoneXmlRpcRequest.
+typedef NS_ENUM(NSInteger,XmlRpcArgType) {
+    XmlRpcArgType_None = 0,
+    Int = 1,
+    String = 2,
+    StringStruct = 3
+    
+};
+
+///Enum describing the status of a LinphoneXmlRpcRequest.
+typedef NS_ENUM(NSInteger,XmlRpcStatus) {
+     XmlRpcStatus_Pending = 0,
+     XmlRpcStatus_Ok = 1,
+     XmlRpcStatus_Failed = 2
+    
+};
+///Enum describing the ZRTP SAS validation status of a peer URI.
+typedef NS_ENUM(NSInteger,ZrtpPeerStatus) {
+     /// Peer URI unkown or never validated/invalidated the SAS.
+      ZrtpPeerStatus_Unknown = 0,
+     /// Peer URI SAS rejected in database.
+      ZrtpPeerStatus_Invalid = 1,
+     /// Peer URI SAS validated in database.
+      Valid = 2
+};
+
+/// Class basic linphone class
+@interface LinphoneObject : NSObject
+@property (assign, nonatomic) LinphoneConfig *cPtr;
+@property (assign, nonatomic) belle_sip_object_t *cPtr1;
+
+-(instancetype)initWith:(belle_sip_object_t*)cPointer;
+@end
+
+@interface Config : LinphoneObject
++(instancetype)getSwiftObject:(LinphoneConfig*)cPointer;
+-(void)setString:(NSString *)section key:(NSString *)key value:(NSString *)value;
+-(NSString *)getString:(NSString *)section key:(NSString *)key defaultString:(NSString *)defaultString;
+-(void)setInt:(NSString *)section key:(NSString *)key value:(int)value;
+-(int)getInt:(NSString *)section key:(NSString *)key defaultValue:(int)defaultValue;
+@end
+
+
+@interface LinPhoneWraper : NSObject
++(NSString *) charArrayToString:(nullable const char *)charPointer;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinPhoneWraper.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinPhoneWraper.m"
new file mode 100644
index 0000000..94b6bed
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinPhoneWraper.m"
@@ -0,0 +1,67 @@
+//
+//  LinPhoneWraper.m
+//  HDLLinPhoneSDK
+//
+//  Created by 闄堝惎鎵� on 2021/8/12.
+//  Copyright 漏 2021 闄堝惎鎵�. All rights reserved.
+//
+
+#import "LinPhoneWraper.h"
+
+@implementation LinphoneObject
+-(instancetype)initWith:(belle_sip_object_t*)cPointer{
+    self = [super init]; //鐢ㄤ簬鍒濆鍖栫埗绫�
+    if (self) {
+        self.cPtr1 = cPointer;
+        belle_sip_object_ref(self.cPtr1);
+    }
+    return self;
+}
+-(void)dealloc{
+    belle_sip_object_data_set(self.cPtr1, "swiftRef",  nil, nil);
+    belle_sip_object_unref(self.cPtr1);
+}
+@end
+
+@implementation Config
++(instancetype)getSwiftObject:(LinphoneConfig*)cPointer{
+    id result = (__bridge id)(belle_sip_object_data_get(cPointer, "swiftRef"));
+    
+    if (result != nil) {
+        return  (Config *)result;
+    }
+    void *sObject=(__bridge void *)([[self alloc] initWith:cPointer]) ;
+//    belle_sip_object_t *sObject=(__bridge belle_sip_object_t *)([[self alloc] initWith:cPointer]);
+
+    belle_sip_object_data_set(cPointer, "swiftRef",  sObject, nil);
+
+//    let sObject = Config(cPointer: cObject)
+//    belle_sip_object_data_set(UnsafeMutablePointer(cObject), "swiftRef",  UnsafeMutableRawPointer(Unmanaged.passUnretained(sObject).toOpaque()), nil)
+
+    return (__bridge Config *)(sObject);
+}
+-(void)setString:(NSString *)section key:(NSString *)key value:(NSString *)value{
+    linphone_config_set_string(self.cPtr, section.UTF8String, key.UTF8String, value.UTF8String);
+}
+-(NSString *)getString:(NSString *)section key:(NSString *)key defaultString:(NSString *)defaultString{
+    return  [LinPhoneWraper charArrayToString: linphone_config_get_string(self.cPtr, section.UTF8String, key.UTF8String, defaultString.UTF8String)];
+}
+
+-(void)setInt:(NSString *)section key:(NSString *)key value:(int)value{
+    linphone_config_set_int(self.cPtr, section.UTF8String, key.UTF8String, value);
+}
+
+-(int)getInt:(NSString *)section key:(NSString *)key defaultValue:(int)defaultValue{
+    return  linphone_config_get_int(self.cPtr, section.UTF8String, key.UTF8String,defaultValue );
+}
+@end
+
+@implementation LinPhoneWraper
++(NSString *) charArrayToString:(nullable const char *)charPointer{
+    if (charPointer) {
+        return [NSString stringWithCString:charPointer encoding:NSUTF8StringEncoding];
+    }else{
+        return @"";
+    }
+}
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinphoneAppDelegate.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinphoneAppDelegate.h"
new file mode 100644
index 0000000..211bc9c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/LinphoneAppDelegate.h"
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of linphone-iphone 
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#import <UIKit/UIKit.h>
+#import <PushKit/PushKit.h>
+
+//#import "LinphoneCoreSettingsStore.h"
+#import "HDLLinphoneProviderDelegate.h"
+#import <UserNotifications/UserNotifications.h>
+#import <UserNotificationsUI/UserNotificationsUI.h>
+
+@interface LinphoneAppDelegate : NSObject <UIApplicationDelegate, PKPushRegistryDelegate, UNUserNotificationCenterDelegate> {
+    @private
+	UIBackgroundTaskIdentifier bgStartId;
+    BOOL startedInBackground;
+}
+
+- (void)registerForNotifications;
+
+@property (nonatomic, retain) UIAlertController *waitingIndicator;
+@property (nonatomic, retain) NSString *configURL;
+@property (nonatomic, strong) UIWindow* window;
+@property PKPushRegistry* voipRegistry;
+@property HDLLinphoneProviderDelegate *del;
+@property BOOL alreadyRegisteredForNotification;
+@property BOOL onlyPortrait;
+@property UIApplicationShortcutItem *shortcutItem;
+
+@end
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/configManager.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/configManager.h"
new file mode 100644
index 0000000..2613d55
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/configManager.h"
@@ -0,0 +1,36 @@
+//
+//  configManager.h
+//  HDLLinPhoneSDK
+//
+//  Created by 闄堝惎鎵� on 2021/8/12.
+//  Copyright 漏 2021 闄堝惎鎵�. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "LinPhoneWraper.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface configManager : NSObject
++(instancetype)instance;
+-(void)setDb:(LinphoneConfig*)cPointer;
+-(void)lpConfigSetString:(NSString *)value key:(NSString *)key section:(NSString *)section;
+-(void)lpConfigSetString:(NSString *)value key:(NSString *)key;
+-(NSString *)lpConfigStringForKey:(NSString *)key section:(NSString *)section defaultValue:(NSString *)defaultValue;
+-(NSString *)lpConfigStringForKey:(NSString *)key section:(NSString *)section;
+-(NSString *)lpConfigStringForKey:(NSString *)key defaultValue:(NSString *)defaultValue;
+-(NSString *)lpConfigStringForKey:(NSString *)key;
+-(void)lpConfigSetInt:(int)value key:(NSString *)key section:(NSString *)section;
+-(void)lpConfigSetInt:(int)value key:(NSString *)key;
+-(int)lpConfigIntForKey:(NSString *)key section:(NSString *)section defaultValue:(int)defaultValue ;
+-(int)lpConfigIntForKey:(NSString *)key section:(NSString *)section ;
+-(int)lpConfigIntForKey:(NSString *)key defaultValue:(int)defaultValue ;
+-(int)lpConfigIntForKey:(NSString *)key ;
+-(void)lpConfigSetBool:(BOOL)value key:(NSString *)key section:(NSString *)section;
+-(void)lpConfigSetBool:(BOOL)value key:(NSString *)key;
+-(BOOL)lpConfigBoolForKey:(NSString *)key section:(NSString *)section defaultValue:(BOOL)defaultValue;
+-(BOOL)lpConfigBoolForKey:(NSString *)key section:(NSString *)section;
+-(BOOL)lpConfigBoolForKey:(NSString *)key defaultValue:(BOOL)defaultValue;
+-(BOOL)lpConfigBoolForKey:(NSString *)key;
+@end
+
+NS_ASSUME_NONNULL_END
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/configManager.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/configManager.m"
new file mode 100644
index 0000000..603cf7b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/configManager.m"
@@ -0,0 +1,132 @@
+//
+//  configManager.m
+//  HDLLinPhoneSDK
+//
+//  Created by 闄堝惎鎵� on 2021/8/12.
+//  Copyright 漏 2021 闄堝惎鎵�. All rights reserved.
+//
+
+#import "configManager.h"
+
+static configManager  *theConfigManager;
+@implementation configManager{
+    Config *config;
+    NSString *applicationKey;
+}
++(instancetype)instance{
+    static configManager *service = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        service = [[configManager alloc] init];
+//        applicationKey=@"app";
+    });
+    return service;
+}
+-(instancetype)init{
+    self = [super init]; //鐢ㄤ簬鍒濆鍖栫埗绫�
+    if (self) {
+        applicationKey=@"app";
+    }
+    return self;
+
+}
+
+-(void)setDb:(LinphoneConfig*)cPointer{
+    config=[Config getSwiftObject:cPointer];
+}
+
+-(void)lpConfigSetString:(NSString *)value key:(NSString *)key section:(NSString *)section{
+    if (key!=nil) {
+        [config setString:section key:key value:value];
+    }
+}
+-(void)lpConfigSetString:(NSString *)value key:(NSString *)key{
+    [self lpConfigSetString:value key:key section:applicationKey];
+}
+-(NSString *)lpConfigStringForKey:(NSString *)key section:(NSString *)section defaultValue:(NSString *)defaultValue{
+    if (key==nil||!key) {
+        return defaultValue;
+    }
+    NSString *string=[config getString:section key:key defaultString:@""];
+    if (string!=nil) {
+        return string;
+    }
+    return defaultValue;
+}
+
+-(NSString *)lpConfigStringForKey:(NSString *)key section:(NSString *)section{
+    return [self lpConfigStringForKey:key section:section defaultValue:@""];
+}
+
+-(NSString *)lpConfigStringForKey:(NSString *)key defaultValue:(NSString *)defaultValue{
+    return [self lpConfigStringForKey:key section:applicationKey defaultValue:defaultValue];
+}
+-(NSString *)lpConfigStringForKey:(NSString *)key {
+    return [self lpConfigStringForKey:key  defaultValue:@""];
+}
+
+-(void)lpConfigSetInt:(int)value key:(NSString *)key section:(NSString *)section{
+    if (key!=nil) {
+        [config setInt:section key:key value:value];
+    }
+}
+
+-(void)lpConfigSetInt:(int)value key:(NSString *)key {
+    [self lpConfigSetInt:value key:key section:applicationKey];
+}
+
+-(int)lpConfigIntForKey:(NSString *)key section:(NSString *)section defaultValue:(int)defaultValue {
+    if (key==nil) {
+        return defaultValue;
+    }
+    int val=[config getInt:section key:key defaultValue:defaultValue];
+    if (val) {
+        return val;
+    }
+    return defaultValue;
+}
+
+-(int)lpConfigIntForKey:(NSString *)key section:(NSString *)section  {
+    return [self lpConfigIntForKey:key section:section defaultValue:-1 ];
+}
+
+-(int)lpConfigIntForKey:(NSString *)key defaultValue:(int)defaultValue  {
+    return [self lpConfigIntForKey:key section:applicationKey defaultValue:defaultValue];
+}
+
+-(int)lpConfigIntForKey:(NSString *)key  {
+    return [self lpConfigIntForKey:key  defaultValue:-1];
+}
+
+-(void)lpConfigSetBool:(BOOL)value key:(NSString *)key section:(NSString *)section{
+    [self lpConfigSetInt:value?1:0 key:key section:section];
+}
+
+-(void)lpConfigSetBool:(BOOL)value key:(NSString *)key{
+    [self lpConfigSetBool:value key:key section:applicationKey];
+}
+
+
+//pragma mark - LPConfig Functions
+
+-(BOOL)lpConfigBoolForKey:(NSString *)key section:(NSString *)section defaultValue:(BOOL)defaultValue{
+    if ( key==nil) {
+        return defaultValue;
+    }
+    int val=[self lpConfigIntForKey:key section:section defaultValue:-1];
+    return (val != -1) ? (val == 1) : defaultValue;
+}
+
+-(BOOL)lpConfigBoolForKey:(NSString *)key section:(NSString *)section {
+    return [self lpConfigBoolForKey:key section:section defaultValue:false];
+}
+
+-(BOOL)lpConfigBoolForKey:(NSString *)key defaultValue:(BOOL)defaultValue {
+    return [self lpConfigBoolForKey:key section:applicationKey defaultValue:defaultValue];
+}
+
+-(BOOL)lpConfigBoolForKey:(NSString *)key  {
+    return [self lpConfigBoolForKey:key defaultValue:false];
+}
+
+@end
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/charconv.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/charconv.h"
new file mode 100755
index 0000000..2d8f6b4
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/charconv.h"
@@ -0,0 +1,82 @@
+/*
+ * charconv.h
+ * Copyright (C) 2010-2018 Belledonne Communications SARL
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef BCTBX_CHARCONV_H
+#define BCTBX_CHARCONV_H
+
+#include "bctoolbox/port.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief Set the default encoding for the application.
+ *
+ * @param[in] encoding default encoding, "locale" to set it to the system's locale
+ */
+BCTBX_PUBLIC void bctbx_set_default_encoding (const char *encoding);
+
+/**
+ * @brief Return the default encoding for the application.
+ *
+ * @return a pointer to a null-terminated string containing the default encoding.
+ */
+BCTBX_PUBLIC const char *bctbx_get_default_encoding ();
+
+/**
+ * @brief Convert the given string from system locale to UTF8.
+ *
+ * @param[in] str string to convert
+ *
+ * @return a pointer to a null-terminated string containing the converted string. This buffer must then be freed
+ * by caller. NULL on failure.
+ */
+BCTBX_PUBLIC char *bctbx_locale_to_utf8 (const char *str);
+
+/**
+ * @brief Convert the given string from UTF8 to system locale.
+ *
+ * @param[in] str string to convert
+ *
+ * @return a pointer to a null-terminated string containing the converted string. This buffer must then be freed
+ * by caller. NULL on failure.
+ */
+BCTBX_PUBLIC char *bctbx_utf8_to_locale (const char *str);
+
+/**
+ * @brief Convert the given string.
+ *
+ * @param[in] str string to convert
+ * @param[in] encoding charset of the string
+ *
+ * @return a pointer to a null-terminated string containing the converted string. This buffer must then be freed
+ * by caller. NULL on failure.
+ *
+ * @note If encoding is equal to "locale" then it will use the system's locale
+ * @note If encoding is UTF-8 then it returns a copy of str
+ */
+BCTBX_PUBLIC char *bctbx_convert_any_to_utf8 (const char *str, const char *encoding);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BCTBX_CHARCONV_H */
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/compiler.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/compiler.h"
new file mode 100755
index 0000000..8560610
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/compiler.h"
@@ -0,0 +1,49 @@
+/*
+ * compiler.h
+ * Copyright (C) 2010-2018 Belledonne Communications SARL
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef COMPILER_H
+#define COMPILER_H
+
+#ifdef __has_feature
+	#if __has_feature(address_sanitizer)
+		#define BCTBX_ASAN_ENABLED
+	#endif // if __has_feature(address_sanitizer)
+#elif defined(__SANITIZE_ADDRESS__)
+	#define BCTBX_ASAN_ENABLED
+#endif // ifdef __has_feature
+
+#ifdef BCTBX_ASAN_ENABLED
+	#define BCTBX_DISABLE_ASAN __attribute__((no_sanitize_address))
+#else
+	#define BCTBX_DISABLE_ASAN
+#endif // ifdef BCTBX_ASAN_ENABLED
+
+#ifdef __has_attribute
+	#if __has_attribute(no_sanitize)
+		#define BCTBX_DISABLE_UBSAN __attribute__((no_sanitize("undefined")))
+	#else
+		#define BCTBX_DISABLE_UBSAN
+	#endif // __has_attribute(no_sanitize)
+#elif defined(__GNUC__) && !defined(__MINGW32__) && GCC_VERSION >= 40900
+	#define BCTBX_DISABLE_UBSAN __attribute__((no_sanitize_undefined))
+#else
+	#define BCTBX_DISABLE_UBSAN
+#endif // ifdef __has_attribute
+
+#endif // ifdef COMPILER_H
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/crypto.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/crypto.h"
new file mode 100755
index 0000000..6945cf4
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/crypto.h"
@@ -0,0 +1,1165 @@
+/*
+crypto.h
+Copyright (C) 2017  Belledonne Communications SARL
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
+#ifndef BCTBX_CRYPTO_H
+#define BCTBX_CRYPTO_H
+
+#include "bctoolbox/port.h"
+#include "bctoolbox/list.h"
+
+/* key agreements settings defines */
+/* Each algo is defined as a bit toggled in a 32 bits integer,
+ * so we can easily ask for all availables ones
+ */
+#define BCTBX_DHM_UNSET		0x00000000
+#define BCTBX_DHM_2048		0x00000001
+#define BCTBX_DHM_3072		0x00000002
+#define BCTBX_ECDH_X25519	0x00000004
+#define BCTBX_ECDH_X448		0x00000008
+
+/* EdDSA defines */
+#define BCTBX_EDDSA_UNSET	0
+#define BCTBX_EDDSA_25519	1
+#define BCTBX_EDDSA_448		2
+
+#define BCTBX_VERIFY_SUCCESS	0
+#define BCTBX_VERIFY_FAILED	-1
+
+/* Elliptic Curves Key lengths defines:
+theses are redefines of the values defined in decaf headers made available to bctoolbox library users
+bctoolbox will fail to compile if these values are not in sync with the decaf ones */
+#define BCTBX_ECDH_X25519_PUBLIC_SIZE	32
+#define BCTBX_ECDH_X25519_PRIVATE_SIZE	BCTBX_ECDH_X25519_PUBLIC_SIZE
+#define BCTBX_ECDH_X448_PUBLIC_SIZE	56
+#define BCTBX_ECDH_X448_PRIVATE_SIZE	BCTBX_ECDH_X448_PUBLIC_SIZE
+
+#define BCTBX_EDDSA_25519_PUBLIC_SIZE	32
+#define BCTBX_EDDSA_25519_PRIVATE_SIZE	BCTBX_EDDSA_25519_PUBLIC_SIZE
+#define BCTBX_EDDSA_25519_SIGNATURE_SIZE	(BCTBX_EDDSA_25519_PUBLIC_SIZE + BCTBX_EDDSA_25519_PRIVATE_SIZE)
+#define BCTBX_EDDSA_448_PUBLIC_SIZE	57
+#define BCTBX_EDDSA_448_PRIVATE_SIZE	BCTBX_EDDSA_448_PUBLIC_SIZE
+#define BCTBX_EDDSA_448_SIGNATURE_SIZE	(BCTBX_EDDSA_448_PUBLIC_SIZE + BCTBX_EDDSA_448_PRIVATE_SIZE)
+
+
+/* SSL settings defines */
+#define BCTBX_SSL_UNSET -1
+
+#define BCTBX_SSL_IS_CLIENT 0
+#define BCTBX_SSL_IS_SERVER 1
+
+#define BCTBX_SSL_TRANSPORT_STREAM 0
+#define BCTBX_SSL_TRANSPORT_DATAGRAM 1
+
+#define BCTBX_SSL_VERIFY_NONE 0
+#define BCTBX_SSL_VERIFY_OPTIONAL 1
+#define BCTBX_SSL_VERIFY_REQUIRED 2
+
+/* Encryption/decryption defines */
+#define BCTBX_GCM_ENCRYPT     1
+#define BCTBX_GCM_DECRYPT     0
+
+/* Error codes : All error codes are negative and defined  on 32 bits on format -0x7XXXXXXX
+ * in order to be sure to not overlap on crypto librairy (polarssl or mbedtls for now) which are defined on 16 bits 0x[7-0]XXX */
+#define BCTBX_ERROR_UNSPECIFIED_ERROR			-0x70000000
+#define BCTBX_ERROR_OUTPUT_BUFFER_TOO_SMALL		-0x70001000
+#define BCTBX_ERROR_INVALID_BASE64_INPUT		-0x70002000
+#define BCTBX_ERROR_INVALID_INPUT_DATA			-0x70004000
+#define BCTBX_ERROR_UNAVAILABLE_FUNCTION		-0x70008000
+
+/* key related */
+#define BCTBX_ERROR_UNABLE_TO_PARSE_KEY		-0x70010000
+
+/* Certificate related */
+#define BCTBX_ERROR_INVALID_CERTIFICATE			-0x70020000
+#define BCTBX_ERROR_CERTIFICATE_GENERATION_FAIL	-0x70020001
+#define BCTBX_ERROR_CERTIFICATE_WRITE_PEM		-0x70020002
+#define BCTBX_ERROR_CERTIFICATE_PARSE_PEM		-0x70020004
+#define BCTBX_ERROR_UNSUPPORTED_HASH_FUNCTION	-0x70020008
+
+/* SSL related */
+#define BCTBX_ERROR_INVALID_SSL_CONFIG		-0x70030001
+#define BCTBX_ERROR_INVALID_SSL_TRANSPORT	-0x70030002
+#define BCTBX_ERROR_INVALID_SSL_ENDPOINT	-0x70030004
+#define BCTBX_ERROR_INVALID_SSL_AUTHMODE	-0x70030008
+#define BCTBX_ERROR_INVALID_SSL_CONTEXT		-0x70030010
+
+#define BCTBX_ERROR_NET_WANT_READ			-0x70032000
+#define BCTBX_ERROR_NET_WANT_WRITE			-0x70034000
+#define BCTBX_ERROR_SSL_PEER_CLOSE_NOTIFY	-0x70038000
+#define BCTBX_ERROR_NET_CONN_RESET			-0x70030000
+
+/* Symmetric ciphers related */
+#define BCTBX_ERROR_AUTHENTICATION_FAILED	-0x70040000
+
+/* certificate verification flags codes */
+#define BCTBX_CERTIFICATE_VERIFY_ALL_FLAGS				0xFFFFFFFF
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_EXPIRED		0x01  /**< The certificate validity has expired. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_REVOKED		0x02  /**< The certificate has been revoked (is on a CRL). */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_CN_MISMATCH	0x04  /**< The certificate Common Name (CN) does not match with the expected CN. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_NOT_TRUSTED	0x08  /**< The certificate is not correctly signed by the trusted CA. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_MISSING		0x10  /**< Certificate was missing. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_SKIP_VERIFY	0x20  /**< Certificate verification was skipped. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_OTHER			0x0100  /**< Other reason (can be used by verify callback) */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_FUTURE			0x0200  /**< The certificate validity starts in the future. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_KEY_USAGE      0x0400  /**< Usage does not match the keyUsage extension. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_EXT_KEY_USAGE  0x0800  /**< Usage does not match the extendedKeyUsage extension. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_NS_CERT_TYPE   0x1000  /**< Usage does not match the nsCertType extension. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_BAD_MD         0x2000  /**< The certificate is signed with an unacceptable hash. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_BAD_PK         0x4000  /**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */
+#define BCTBX_CERTIFICATE_VERIFY_BADCERT_BAD_KEY        0x8000  /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */
+
+#define BCTBX_CERTIFICATE_VERIFY_BADCRL_FUTURE			0x10000  /**< The CRL is from the future */
+#define BCTBX_CERTIFICATE_VERIFY_BADCRL_NOT_TRUSTED		0x20000  /**< CRL is not correctly signed by the trusted CA. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCRL_EXPIRED			0x40000  /**< CRL is expired. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCRL_BAD_MD          0x80000  /**< The CRL is signed with an unacceptable hash. */
+#define BCTBX_CERTIFICATE_VERIFY_BADCRL_BAD_PK          0x100000  /**< The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). */
+#define BCTBX_CERTIFICATE_VERIFY_BADCRL_BAD_KEY         0x200000  /**< The CRL is signed with an unacceptable key (eg bad curve, RSA too short). */
+
+
+/* Hash functions type */
+typedef enum bctbx_md_type {
+	BCTBX_MD_UNDEFINED,
+	BCTBX_MD_SHA1,
+	BCTBX_MD_SHA224,
+	BCTBX_MD_SHA256,
+	BCTBX_MD_SHA384,
+	BCTBX_MD_SHA512} bctbx_md_type_t;
+
+/* Dtls srtp protection profile */
+typedef enum bctbx_srtp_profile {
+	BCTBX_SRTP_UNDEFINED,
+	BCTBX_SRTP_AES128_CM_HMAC_SHA1_80,
+	BCTBX_SRTP_AES128_CM_HMAC_SHA1_32,
+	BCTBX_SRTP_NULL_HMAC_SHA1_80,
+	BCTBX_SRTP_NULL_HMAC_SHA1_32
+} bctbx_dtls_srtp_profile_t;
+
+typedef enum bctbx_type_implementation {
+	BCTBX_POLARSSL,
+	BCTBX_POLARSSL1_2,
+	BCTBX_MBEDTLS
+} bctbx_type_implementation_t;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/*****************************************************************************/
+/****** Utils                                                           ******/
+/*****************************************************************************/
+/**
+ * @brief Return a string translation of an error code
+ * PolarSSL and mbedTLS error codes are on 16 bits always negatives, and these are forwarded to the crypto library error to string translation
+ * Specific bctoolbox error code are on 32 bits, all in the form -0x7XXX XXXX
+ * Output string is truncated if the buffer is too small and always include a null termination char
+ *
+ * @param[in]		error_code		The error code
+ * @param[in/out]	buffer			Buffer to place error string representation
+ * @param[in]		buffer_length	Size of the buffer in bytes.
+ */
+BCTBX_PUBLIC void bctbx_strerror(int32_t error_code, char *buffer, size_t buffer_length);
+
+/**
+ * @brief Encode a buffer into base64 format
+ * @param[out]		output			base64 encoded buffer
+ * @param[in/out]	output_length	output buffer max size and actual size of buffer after encoding
+ * @param[in]		input			source plain buffer
+ * @param[in]		input_length	Length in bytes of plain buffer to be encoded
+ *
+ * @return 0 if success or BCTBX_ERROR_OUTPUT_BUFFER_TOO_SMALL if the output buffer cannot contain the encoded data
+ *
+ * @note If the function is called with *output_length=0, set the requested buffer size in output_length
+ */
+BCTBX_PUBLIC int32_t bctbx_base64_encode(unsigned char *output, size_t *output_length, const unsigned char *input, size_t input_length);
+
+/**
+ * @brief Decode a base64 formatted buffer.
+ * @param[out]		output			plain buffer
+ * @param[in/out]	output_length	output buffer max size and actual size of buffer after decoding
+ * @param[in]		input			source base64 encoded buffer
+ * @param[in]		input_length	Length in bytes of base64 buffer to be decoded
+ *
+ * @return 0 if success, BCTBX_ERROR_OUTPUT_BUFFER_TOO_SMALL if the output buffer cannot contain the decoded data
+ * or BCTBX_ERROR_INVALID_BASE64_INPUT if encoded buffer was incorrect base64 data
+ *
+ * @note If the function is called with *output_length=0, set the requested buffer size in output_length
+ */
+BCTBX_PUBLIC int32_t bctbx_base64_decode(unsigned char *output, size_t *output_length, const unsigned char *input, size_t input_length);
+
+/*****************************************************************************/
+/****** Random Number Generation                                        ******/
+/*****************************************************************************/
+/** @brief An opaque structure used to store RNG context
+ * Instanciate pointers only and allocate them using the bctbx_rng_context_new() function
+ */
+typedef struct bctbx_rng_context_struct bctbx_rng_context_t;
+
+/**
+ * @brief Create and initialise the Random Number Generator context
+ * @return a pointer to the RNG context
+ */
+BCTBX_PUBLIC bctbx_rng_context_t *bctbx_rng_context_new(void);
+
+/**
+ * @brief Get some random material
+ *
+ * @param[in/out]	context			The RNG context to be used
+ * @param[out]		output			A destination buffer for the random material generated
+ * @param[in]		output_length	Size in bytes of the output buffer and requested random material
+ *
+ * @return 0 on success
+ */
+BCTBX_PUBLIC int32_t bctbx_rng_get(bctbx_rng_context_t *context, unsigned char*output, size_t output_length);
+
+/**
+ * @brief Clear the RNG context and free internal buffer
+ *
+ * @param[in]	context		The RNG context to clear
+ */
+BCTBX_PUBLIC void bctbx_rng_context_free(bctbx_rng_context_t *context);
+
+/*****************************************************************************/
+/***** Signing key                                                       *****/
+/*****************************************************************************/
+/** @brief An opaque structure used to store the signing key context
+ * Instanciate pointers only and allocate them using the bctbx_signing_key_new() function
+ */
+typedef struct bctbx_signing_key_struct bctbx_signing_key_t;
+
+/**
+ * @brief Create and initialise a signing key context
+ * @return a pointer to the signing key context
+ */
+BCTBX_PUBLIC bctbx_signing_key_t *bctbx_signing_key_new(void);
+
+/**
+ * @brief Clear the signing key context and free internal buffer
+ *
+ * @param[in]	key		The signing key context to clear
+ */
+BCTBX_PUBLIC void  bctbx_signing_key_free(bctbx_signing_key_t *key);
+
+/**
+ * @brief	Write the key in a buffer as a PEM string
+ *
+ * @param[in]	key		The signing key to be extracted in PEM format
+ *
+ * @return a pointer to a null terminated string containing the key in PEM format. This buffer must then be freed by caller. NULL on failure.
+ */
+BCTBX_PUBLIC char *bctbx_signing_key_get_pem(bctbx_signing_key_t *key);
+
+/**
+ * @brief Parse signing key in PEM format from a null terminated string buffer
+ *
+ * @param[in/out]	key				An already initialised signing key context
+ * @param[in]		buffer			The input buffer containing a PEM format key in a null terminated string
+ * @param[in]		buffer_length	The length of input buffer, including the NULL termination char
+ * @param[in]		password		Password for decryption(may be NULL)
+ * @param[in]		passzord_length	size of password
+ *
+ * @return 0 on success
+ */
+BCTBX_PUBLIC int32_t bctbx_signing_key_parse(bctbx_signing_key_t *key, const char *buffer, size_t buffer_length, const unsigned char *password, size_t password_length);
+
+/**
+ * @brief Parse signing key from a file
+ *
+ * @param[in/out]	key				An already initialised signing key context
+ * @param[in]		path			filename to read the key from
+ * @param[in]		password		Password for decryption(may be NULL)
+ *
+ * @return 0 on success
+ */
+BCTBX_PUBLIC int32_t bctbx_signing_key_parse_file(bctbx_signing_key_t *key, const char *path, const char *password);
+
+/*****************************************************************************/
+/***** X509 Certificate                                                  *****/
+/*****************************************************************************/
+/** @brief An opaque structure used to store the certificate context
+ * Instanciate pointers only and allocate them using the bctbx_x509_certificate_new() function
+ */
+typedef struct bctbx_x509_certificate_struct bctbx_x509_certificate_t;
+
+/**
+ * @brief Create and initialise a x509 certificate context
+ * @return a pointer to the certificate context
+ */
+BCTBX_PUBLIC bctbx_x509_certificate_t *bctbx_x509_certificate_new(void);
+
+/**
+ * @brief Clear the certificate context and free internal buffer
+ *
+ * @param[in]	cert		The x509 certificate context to clear
+ */
+BCTBX_PUBLIC void  bctbx_x509_certificate_free(bctbx_x509_certificate_t *cert);
+
+/**
+ * @brief	Write the certificate in a buffer as a PEM string
+ *
+ * @param[in]	cert	The certificate to be extracted in PEM format
+ *
+ * @return a pointer to a null terminated string containing the certificate in PEM format. This buffer must then be freed by caller. NULL on failure.
+ */
+BCTBX_PUBLIC char *bctbx_x509_certificates_chain_get_pem(bctbx_x509_certificate_t *cert);
+
+/**
+ * @brief	Return an informational string about the certificate
+ *
+ * @param[out]	buf	Buffer to receive the output
+ * @param[in]	size	Maximum output buffer size
+ * @param[in]	prefix	A line prefix
+ * @param[in]	cert	The x509 certificate
+ *
+ * @return	The length of the string written or a negative error code
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_get_info_string(char *buf, size_t size, const char *prefix, const bctbx_x509_certificate_t *cert);
+
+/**
+ * @brief Parse an x509 certificate in PEM format from a null terminated string buffer
+ *
+ * @param[in/out]	cert		An already initialised x509 certificate context
+ * @param[in]		buffer		The input buffer containing a PEM format certificate in a null terminated string
+ * @param[in]		buffer_length	The length of input buffer, including the NULL termination char
+ *
+ * @return	0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_parse(bctbx_x509_certificate_t *cert, const char *buffer, size_t buffer_length);
+
+/**
+ * @brief Load one or more certificates and add them to the chained list
+ *
+ * @param[in/out]	cert	points to the start of the chain, can be an empty initialised certificate context
+ * @param[in]		path	filename to read the certificate from
+ *
+ * @return	0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_parse_file(bctbx_x509_certificate_t *cert, const char *path);
+
+/**
+ * @brief Load one or more certificates files from a path and add them to the chained list
+ *
+ * @param[in/out]	cert	points to the start of the chain, can be an empty initialised certificate context
+ * @param[in]		path	directory to read certicates files from
+ *
+ * @return	0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_parse_path(bctbx_x509_certificate_t *cert, const char *path);
+
+/**
+ * @brief Get the length in bytes of a certifcate chain in DER format
+ *
+ * @param[in]	cert	The certificate chain
+ *
+ * @return	The length in bytes of the certificate buffer in DER format, 0 if no certificate found
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_get_der_length(bctbx_x509_certificate_t *cert);
+
+/**
+ * @brief	Get the certificate in DER format in a null terminated string
+ *
+ * @param[in]		cert		The certificate chain
+ * @param[in/out]	buffer		The buffer to hold the certificate
+ * @param[in]		buffer_length	Maximum output buffer size
+ *
+ * @return 0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_get_der(bctbx_x509_certificate_t *cert, unsigned char *buffer, size_t buffer_length);
+
+/**
+ * @brief Store the certificate subject DN in printable form into buf
+ *
+ * @param[in]		cert		The x509 certificate
+ * @param[in/out]	dn		A buffer to store the DN string
+ * @param[in]		dn_length	Maximum size to be written in buffer
+ *
+ * @return The length of the string written (not including the terminated nul byte), or a negative error code
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_get_subject_dn(const bctbx_x509_certificate_t *cert, char *dn, size_t dn_length);
+
+/**
+ * @brief Obtain the certificate subjects (all subjectAltName URIS and DNS + subject CN)
+ *
+ * @param[in]		cert		The x509 certificate
+ * @return a list of allocated strings (char*), to be freed with bctbx_free()
+ */
+BCTBX_PUBLIC bctbx_list_t *bctbx_x509_certificate_get_subjects(const bctbx_x509_certificate_t *cert);
+
+/**
+ * @brief Generate certificate fingerprint (hash of the DER format certificate) hexadecimal format in a null terminated string
+ *
+ * @param[in]		cert			The x509 certificate
+ * @param[in/out]	fingerprint		The buffer to hold the fingerprint(null terminated string in hexadecimal)
+ * @param[in]		fingerprint_length	Maximum length of the fingerprint buffer
+ * @param[in]		hash_algorithm		set to BCTBX_MD_UNDEFINED to use the hash used in certificate signature(recommended)
+ *						or specify an other hash algorithm(BCTBX_MD_SHA1, BCTBX_MD_SHA224, BCTBX_MD_SHA256, BCTBX_MD_SHA384, BCTBX_MD_SHA512)
+ * @return length of written on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_get_fingerprint(const bctbx_x509_certificate_t *cert, char *fingerprint, size_t fingerprint_length, bctbx_md_type_t hash_algorithm);
+
+/**
+ * @brief Retrieve the certificate signature hash function
+ *
+ * @param[in]	cert		The x509 certificate
+ * @param[out]	hash_algorithm	The hash algorithm used for the certificate signature or BCTBX_MD_UNDEFINED if unable to retrieve it
+ *
+ * @return 0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_get_signature_hash_function(const bctbx_x509_certificate_t *certificate, bctbx_md_type_t *hash_algorithm);
+
+/**
+ * @brief Generate a self-signed certificate using RSA 3072 bits signature algorithm
+ *
+ * @param[in]		subject		The certificate subject
+ * @param[in/out]	certificate	An empty intialised certificate pointer to hold the generated certificate
+ * @param[in/out]	pkey		An empty initialised signing key pointer to hold the key generated and used to sign the certificate (RSA 3072 bits)
+ * @param[out]		pem		If not null, a buffer to hold a PEM string of the certificate and key
+ * @param[in]		pem_length	pem buffer length
+ *
+ * @return 0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_generate_selfsigned(const char *subject, bctbx_x509_certificate_t *certificate, bctbx_signing_key_t *pkey, char *pem, size_t pem_length);
+
+/**
+ * @brief Convert underlying crypto library certificate flags into a printable string
+ *
+ * @param[out]	buffer		a buffer to hold the output string
+ * @param[in]	buffer_size	maximum buffer size
+ * @param[in]	flags		The flags from the underlying crypto library, provided in callback functions
+ *
+ * @return 0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_flags_to_string(char *buffer, size_t buffer_size, uint32_t flags);
+
+/**
+ * @brief Set a certificate flags (using underlying crypto library defines)
+ *
+ * @param[in/out]	flags		The certificate flags holder directly provided by crypto library in a callback function
+ * @param[in]		flags_to_set	Flags to be set, bctoolbox defines
+ *
+ * @return 0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_set_flag(uint32_t *flags, uint32_t flags_to_set);
+
+/**
+ * @brief convert certificate flags from underlying crypto library defines to bctoolbox ones
+ *
+ * @param[in]	flags	certificate flags provided by the crypto library in a callback function
+ *
+ * @return same flag but using the bctoolbox API definitions
+ */
+BCTBX_PUBLIC uint32_t bctbx_x509_certificate_remap_flag(uint32_t flags);
+
+/**
+ * @brief Unset a certificate flags (using underlying crypto library defines)
+ *
+ * @param[in/out]	flags		The certificate flags holder directly provided by crypto library in a callback function
+ * @param[in]		flags_to_set	Flags to be unset, bctoolbox defines
+ *
+ * @return 0 on success, negative error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_x509_certificate_unset_flag(uint32_t *flags, uint32_t flags_to_unset);
+
+
+/*****************************************************************************/
+/***** SSL                                                               *****/
+/*****************************************************************************/
+typedef struct bctbx_ssl_context_struct bctbx_ssl_context_t;
+typedef struct bctbx_ssl_config_struct bctbx_ssl_config_t;
+BCTBX_PUBLIC bctbx_type_implementation_t bctbx_ssl_get_implementation_type(void);
+BCTBX_PUBLIC bctbx_ssl_context_t *bctbx_ssl_context_new(void);
+BCTBX_PUBLIC void bctbx_ssl_context_free(bctbx_ssl_context_t *ssl_ctx);
+BCTBX_PUBLIC int32_t bctbx_ssl_context_setup(bctbx_ssl_context_t *ssl_ctx, bctbx_ssl_config_t *ssl_config);
+
+BCTBX_PUBLIC int32_t bctbx_ssl_close_notify(bctbx_ssl_context_t *ssl_ctx);
+BCTBX_PUBLIC int32_t bctbx_ssl_session_reset(bctbx_ssl_context_t *ssl_ctx);
+BCTBX_PUBLIC int32_t bctbx_ssl_read(bctbx_ssl_context_t *ssl_ctx, unsigned char *buf, size_t buf_length);
+BCTBX_PUBLIC int32_t bctbx_ssl_write(bctbx_ssl_context_t *ssl_ctx, const unsigned char *buf, size_t buf_length);
+BCTBX_PUBLIC int32_t bctbx_ssl_set_hostname(bctbx_ssl_context_t *ssl_ctx, const char *hostname);
+BCTBX_PUBLIC int32_t bctbx_ssl_handshake(bctbx_ssl_context_t *ssl_ctx);
+BCTBX_PUBLIC int32_t bctbx_ssl_set_hs_own_cert(bctbx_ssl_context_t *ssl_ctx, bctbx_x509_certificate_t *cert, bctbx_signing_key_t *key);
+BCTBX_PUBLIC void bctbx_ssl_set_io_callbacks(bctbx_ssl_context_t *ssl_ctx, void *callback_data,
+		int(*callback_send_function)(void *, const unsigned char *, size_t), /* callbacks args are: callback data, data buffer to be send, size of data buffer */
+		int(*callback_recv_function)(void *, unsigned char *, size_t)); /* args: callback data, data buffer to be read, size of data buffer */
+BCTBX_PUBLIC const bctbx_x509_certificate_t *bctbx_ssl_get_peer_certificate(bctbx_ssl_context_t *ssl_ctx);
+BCTBX_PUBLIC const char *bctbx_ssl_get_ciphersuite(bctbx_ssl_context_t *ssl_ctx);
+BCTBX_PUBLIC int bctbx_ssl_get_ciphersuite_id(const char* ciphersuite);
+BCTBX_PUBLIC const char *bctbx_ssl_get_version(bctbx_ssl_context_t *ssl_ctx);
+	
+BCTBX_PUBLIC bctbx_ssl_config_t *bctbx_ssl_config_new(void);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_crypto_library_config(bctbx_ssl_config_t *ssl_config, void *internal_config);
+BCTBX_PUBLIC void bctbx_ssl_config_free(bctbx_ssl_config_t *ssl_config);
+BCTBX_PUBLIC void *bctbx_ssl_config_get_private_config(bctbx_ssl_config_t *ssl_config);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_defaults(bctbx_ssl_config_t *ssl_config, int endpoint, int transport);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_endpoint(bctbx_ssl_config_t *ssl_config, int endpoint);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_transport (bctbx_ssl_config_t *ssl_config, int transport);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_authmode(bctbx_ssl_config_t *ssl_config, int authmode);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_rng(bctbx_ssl_config_t *ssl_config, int(*rng_function)(void *, unsigned char *, size_t), void *rng_context);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_callback_verify(bctbx_ssl_config_t *ssl_config, int(*callback_function)(void *, bctbx_x509_certificate_t *, int, uint32_t *), void *callback_data);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_callback_cli_cert(bctbx_ssl_config_t *ssl_config, int(*callback_function)(void *, bctbx_ssl_context_t *, unsigned char *, size_t), void *callback_data);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_ca_chain(bctbx_ssl_config_t *ssl_config, bctbx_x509_certificate_t *ca_chain);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_own_cert(bctbx_ssl_config_t *ssl_config, bctbx_x509_certificate_t *cert, bctbx_signing_key_t *key);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_ciphersuites(bctbx_ssl_config_t *ssl_config,const int *ciphersuites);
+	
+/***** DTLS-SRTP functions *****/
+BCTBX_PUBLIC bctbx_dtls_srtp_profile_t bctbx_ssl_get_dtls_srtp_protection_profile(bctbx_ssl_context_t *ssl_ctx);
+BCTBX_PUBLIC int32_t bctbx_ssl_config_set_dtls_srtp_protection_profiles(bctbx_ssl_config_t *ssl_config, const bctbx_dtls_srtp_profile_t *profiles, size_t profiles_number);
+BCTBX_PUBLIC int32_t bctbx_ssl_get_dtls_srtp_key_material(bctbx_ssl_context_t *ssl_ctx, char *output, size_t *output_length);
+BCTBX_PUBLIC uint8_t bctbx_dtls_srtp_supported(void);
+BCTBX_PUBLIC void bctbx_ssl_set_mtu(bctbx_ssl_context_t *ssl_ctx, uint16_t mtu);
+
+
+/*****************************************************************************/
+/***** Key exchanges defined algorithms                                  *****/
+/*****************************************************************************/
+/**
+ * @brief Return a 32 bits unsigned integer, each bit set to one matches an
+ * available key agreement algorithm as defined in bctoolbox/include/crypto.h
+ *
+ * @return An unsigned integer of 32 flags matching key agreement algos
+ */
+BCTBX_PUBLIC uint32_t bctbx_key_agreement_algo_list(void);
+
+/*****************************************************************************/
+/***** Diffie-Hellman-Merkle key exchange                                *****/
+/*****************************************************************************/
+/**
+ * @brief Context for the Diffie-Hellman-Merkle key exchange
+ *	Use RFC3526 values for G and P
+ */
+typedef struct bctbx_DHMContext_struct {
+	uint8_t algo; /**< Algorithm used for the key exchange mapped to an int: BCTBX_DHM_2048, BCTBX_DHM_3072 */
+	uint16_t primeLength; /**< Prime number length in bytes(256 or 384)*/
+	uint8_t *secret; /**< the random secret (X), this field may not be used if the crypto module implementation already store this value in his context */
+	uint8_t secretLength; /**< in bytes */
+	uint8_t *key; /**< the key exchanged (G^Y)^X mod P */
+	uint8_t *self; /**< this side of the public exchange G^X mod P */
+	uint8_t *peer; /**< the other side of the public exchange G^Y mod P */
+	void *cryptoModuleData; /**< a context needed by the crypto implementation */
+}bctbx_DHMContext_t;
+
+/**
+ *
+ * @brief Create a context for the DHM key exchange
+ * 	This function will also instantiate the context needed by the actual implementation of the crypto module
+ *
+ * @param[in] DHMAlgo		The algorithm type(BCTBX_DHM_2048 or BCTBX_DHM_3072)
+ * @param[in] secretLength	The length in byte of the random secret(X).
+ *
+ * @return The initialised context for the DHM calculation(must then be freed calling the destroyDHMContext function), NULL on error
+ *
+ */
+BCTBX_PUBLIC bctbx_DHMContext_t *bctbx_CreateDHMContext(uint8_t DHMAlgo, uint8_t secretLength);
+
+/**
+ *
+ * @brief Generate the private secret X and compute the public value G^X mod P
+ * G, P and X length have been set by previous call to DHM_CreateDHMContext
+ *
+ * @param[in/out] 	context		DHM context, will store the public value in ->self after this call
+ * @param[in] 		rngFunction	pointer to a random number generator used to create the secret X
+ * @param[in]		rngContext	pointer to the rng context if neeeded
+ *
+ */
+BCTBX_PUBLIC void bctbx_DHMCreatePublic(bctbx_DHMContext_t *context, int (*rngFunction)(void *, uint8_t *, size_t), void *rngContext);
+
+/**
+ *
+ * @brief Compute the secret key G^X^Y mod p
+ * G^X mod P has been computed in previous call to DHMCreatePublic
+ * G^Y mod P must have been set in context->peer
+ *
+ * @param[in/out] 	context		Read the public values from context, export the key to context->key
+ * @param[in]		rngFunction	Pointer to a random number generation function, used for blinding countermeasure, may be NULL
+ * @param[in]		rngContext	Pointer to the RNG function context
+ *
+ */
+BCTBX_PUBLIC void bctbx_DHMComputeSecret(bctbx_DHMContext_t *context, int (*rngFunction)(void *, uint8_t *, size_t), void *rngContext);
+
+/**
+ *
+ * @brief Clean DHM context. Secret and key, if present, are erased from memory(set to 0)
+ *
+ * @param	context	The context to deallocate
+ *
+ */
+BCTBX_PUBLIC void bctbx_DestroyDHMContext(bctbx_DHMContext_t *context);
+
+
+/*****************************************************************************/
+/***** Elliptic Curve Diffie-Hellman-Merkle key exchange                 *****/
+/*****************************************************************************/
+/**
+ *
+ * @brief return TRUE if the Elliptic Curve Cryptography is available
+ */
+BCTBX_PUBLIC int bctbx_crypto_have_ecc(void);
+
+/**
+ * @brief Context for the EC Diffie-Hellman-Merkle key exchange on curve 25519 and 448
+ *	Use RFC7748 for base points values
+ */
+typedef struct bctbx_ECDHContext_struct {
+	uint8_t algo; /**< Algorithm used for the key exchange mapped to an int: BCTBX_ECDH_X25519, BCTBX_ECDH_X448 */
+	uint16_t pointCoordinateLength; /**< length in bytes of the point u-coordinate, can be 32 or 56 */
+	uint8_t *secret; /**< the random secret (scalar) used to compute public key and shared secret */
+	uint8_t secretLength; /**< in bytes, usually the same than pointCoordinateLength */
+	uint8_t *sharedSecret; /**< the key exchanged scalar multiplation of MULT(Self Secret, MULT(Peer Secret, BasePoint)), u-coordinate */
+	uint8_t *selfPublic; /**< this side of the public exchange: MULT(self secret, BasePoint), u-coordinate */
+	uint8_t *peerPublic; /**< the other side of the public exchange: MULT(peer secret, BasePoint), u-coordinate */
+	void *cryptoModuleData; /**< a context needed by the underlying crypto implementation - note if in use, most of the previous buffers could be store in it actually */
+}bctbx_ECDHContext_t;
+
+/**
+ *
+ * @brief Create a context for the ECDH key exchange
+ *
+ * @param[in] ECDHAlgo		The algorithm type(BCTBX_ECDH_X25519 or BCTBX_ECDH_X448)
+ *
+ * @return The initialised context for the ECDH calculation(must then be freed calling the destroyECDHContext function), NULL on error
+ *
+ */
+BCTBX_PUBLIC bctbx_ECDHContext_t *bctbx_CreateECDHContext(const uint8_t ECDHAlgo);
+
+/**
+ *
+ * @brief Generate the private secret scalar and compute the public key MULT(scalar, BasePoint)
+ *
+ * @param[in/out] 	context		ECDH context, will store the public value in ->selfPublic after this call, and secret in ->secret
+ * @param[in] 		rngFunction	pointer to a random number generator used to create the secret
+ * @param[in]		rngContext	pointer to the rng context if neeeded
+ *
+ */
+BCTBX_PUBLIC void bctbx_ECDHCreateKeyPair(bctbx_ECDHContext_t *context, int (*rngFunction)(void *, uint8_t *, size_t), void *rngContext);
+
+/**
+ *
+ * @brief	Set the given secret key in the ECDH context
+ *
+ * @param[in/out]	context		ECDH context, will store the given secret key if length is matching the pre-setted algo for this context
+ * @param[in]		secret		The buffer holding the secret, is duplicated in the ECDH context
+ * @param[in]		secretLength	Length of previous buffer, must match the algo type setted at context creation
+ */
+BCTBX_PUBLIC void bctbx_ECDHSetSecretKey(bctbx_ECDHContext_t *context, const uint8_t *secret, const size_t secretLength);
+
+/**
+ *
+ * @brief	Set the given self public key in the ECDH context
+ *		Warning: no check if it matches the private key value
+ *
+ * @param[in/out]	context			ECDH context, will store the given self public key if length is matching the pre-setted algo for this context
+ * @param[in]		selfPublic		The buffer holding the self public key, is duplicated in the ECDH context
+ * @param[in]		selfPublicLength	Length of previous buffer, must match the algo type setted at context creation
+ */
+BCTBX_PUBLIC void bctbx_ECDHSetSelfPublicKey(bctbx_ECDHContext_t *context, const uint8_t *selfPublic, const size_t selfPublicLength);
+
+/**
+ *
+ * @brief	Set the given peer public key in the ECDH context
+ *
+ * @param[in/out]	context			ECDH context, will store the given peer public key if length is matching the pre-setted algo for this context
+ * @param[in]		peerPublic		The buffer holding the peer public key, is duplicated in the ECDH context
+ * @param[in]		peerPublicLength	Length of previous buffer, must match the algo type setted at context creation
+ */
+BCTBX_PUBLIC void bctbx_ECDHSetPeerPublicKey(bctbx_ECDHContext_t *context, const uint8_t *peerPublic, const size_t peerPublicLength);
+
+/**
+ *
+ * @brief	Derive the public key from the secret setted in context and using preselected algo, following RFC7748
+ *
+ * @param[in/out]	context		The context holding algo setting and secret, used to store public key
+ */
+BCTBX_PUBLIC void bctbx_ECDHDerivePublicKey(bctbx_ECDHContext_t *context);
+
+/**
+ *
+ * @brief Compute the shared secret MULT(secret, peer Public)
+ * ->peerPublic, containing MULT(peerSecret, basePoint) must have been set before this call in context
+ *
+ * @param[in/out] 	context		Read the public values from context, export the key to context->sharedSecret
+ * @param[in]		rngFunction	Pointer to a random number generation function, used for blinding countermeasure, may be NULL
+ * @param[in]		rngContext	Pointer to the RNG function context
+ *
+ */
+BCTBX_PUBLIC void bctbx_ECDHComputeSecret(bctbx_ECDHContext_t *context, int (*rngFunction)(void *, uint8_t *, size_t), void *rngContext);
+
+/**
+ *
+ * @brief Clean ECDH context. Secret and key, if present, are erased from memory(set to 0)
+ *
+ * @param	context	The context to deallocate
+ *
+ */
+BCTBX_PUBLIC void bctbx_DestroyECDHContext(bctbx_ECDHContext_t *context);
+
+/*****************************************************************************/
+/***** EdDSA: signature and verify using Elliptic curves                 *****/
+/*****************************************************************************/
+/**
+ * @brief Context for the EdDSA using curves 25519 and 448
+ */
+typedef struct bctbx_EDDSAContext_struct {
+	uint8_t algo; /**< Algorithm used for the key exchange mapped to an int: BCTBX_EDDSA_25519, BCTBX_EDDSA_448 */
+	uint16_t pointCoordinateLength; /**< length in bytes of a serialised point coordinate, can be 32 or 57 */
+	uint8_t *secretKey; /**< the random secret (scalar) used to compute public key and message signature, is the same length than a serialised point coordinate */
+	uint8_t secretLength; /**< in bytes, usually the same than pointCoordinateLength */
+	uint8_t *publicKey; /**< MULT(HASH(secretKey), BasePoint), serialised coordinate */
+	void *cryptoModuleData; /**< a context needed by the underlying crypto implementation - note if in use, most of the previous buffers could be store in it actually */
+}bctbx_EDDSAContext_t;
+
+/**
+ *
+ * @brief Create a context for the EdDSA sign/verify
+ *
+ * @param[in] EDDSAAlgo		The algorithm type(BCTBX_EDDSA_25519 or BCTBX_EDDSA_448)
+ *
+ * @return The initialised context for the EDDSA calculation(must then be freed calling the destroyEDDSAContext function), NULL on error
+ *
+ */
+BCTBX_PUBLIC bctbx_EDDSAContext_t *bctbx_CreateEDDSAContext(uint8_t EDDSAAlgo);
+
+/**
+ *
+ * @brief Generate the private secret scalar and compute the public MULT(scalar, BasePoint)
+ *
+ * @param[in/out] 	context		EDDSA context, will store the public value in ->publicKey after this call, and secret in ->secretKey
+ * @param[in] 		rngFunction	pointer to a random number generator used to create the secret
+ * @param[in]		rngContext	pointer to the rng context if neeeded
+ *
+ */
+BCTBX_PUBLIC void bctbx_EDDSACreateKeyPair(bctbx_EDDSAContext_t *context, int (*rngFunction)(void *, uint8_t *, size_t), void *rngContext);
+
+/**
+ *
+ * @brief Using the private secret scalar already set in context, compute the public MULT(scalar, BasePoint)
+ *
+ * @param[in/out] 	context		EDDSA context, will store the public value in ->publicKey after this call, already have secret in ->secretKey
+ *
+ */
+BCTBX_PUBLIC void bctbx_EDDSADerivePublicKey(bctbx_EDDSAContext_t *context);
+
+/**
+ *
+ * @brief Clean ECDH context. Secret and key, if present, are erased from memory(set to 0)
+ *
+ * @param	context	The context to deallocate
+ *
+ */
+BCTBX_PUBLIC void bctbx_DestroyEDDSAContext(bctbx_EDDSAContext_t *context);
+
+/**
+ *
+ * @brief Sign the message given using private key and EdDSA algo set in context
+ *
+ * @param[in]		context			EDDSA context storing the algorithm to use(ed448 or ed25519) and the private key to use
+ * @param[in]		message			The message to be signed
+ * @param[in]		messageLength		Length of the message buffer
+ * @param [in]		associatedData		A "context" for this signature of up to 255 bytes.
+ * @param [in]		associatedDataLength	Length of the context.
+ * @param[out]		signature		The signature
+ * @param[in/out]	signatureLength		The size of the signature buffer as input, the size of the actual signature as output
+ *
+ */
+BCTBX_PUBLIC void bctbx_EDDSA_sign(bctbx_EDDSAContext_t *context, const uint8_t *message, const size_t messageLength, const uint8_t *AssociatedData, const uint8_t associatedDataLength, uint8_t *signature, size_t *signatureLength);
+
+/**
+ *
+ * @brief Set a public key in a EDDSA context to be used to verify messages signature
+ *
+ * @param[in/out]	context		EDDSA context storing the algorithm to use(ed448 or ed25519)
+ * @param[in]		publicKey	The public to store in context
+ * @param[in]		publicKeyLength	The length of previous buffer
+ */
+BCTBX_PUBLIC void bctbx_EDDSA_setPublicKey(bctbx_EDDSAContext_t *context, const uint8_t *publicKey, const size_t publicKeyLength);
+
+/**
+ *
+ * @brief Set a private key in a EDDSA context to be used to sign message
+ *
+ * @param[in/out]	context		EDDSA context storing the algorithm to use(ed448 or ed25519)
+ * @param[in]		secretKey	The secret to store in context
+ * @param[in]		secretKeyLength	The length of previous buffer
+ */
+BCTBX_PUBLIC void bctbx_EDDSA_setSecretKey(bctbx_EDDSAContext_t *context, const uint8_t *secretKey, const size_t secretKeyLength);
+
+/**
+ *
+ * @brief Use the public key set in context to verify the given signature and message
+ *
+ * @param[in/out]	context			EDDSA context storing the algorithm to use(ed448 or ed25519) and public key
+ * @param[in]		message			Message to verify
+ * @param[in]		messageLength		Length of the message buffer
+ * @param [in]		associatedData		A "context" for this signature of up to 255 bytes.
+ * @param [in]		associatedDataLength	Length of the context.
+ * @param[in]		signature		The signature
+ * @param[in]		signatureLength		The size of the signature buffer
+ *
+ * @return BCTBX_VERIFY_SUCCESS or BCTBX_VERIFY_FAILED
+ */
+BCTBX_PUBLIC int bctbx_EDDSA_verify(bctbx_EDDSAContext_t *context, const uint8_t *message, size_t messageLength, const uint8_t *associatedData, const uint8_t associatedDataLength, const uint8_t *signature, size_t signatureLength);
+
+
+/**
+ *
+ * @brief Convert a EDDSA private key to a ECDH private key
+ *      pass the EDDSA private key through the hash function used in EdDSA
+ *
+ * @param[in]	ed	Context holding the current private key to convert
+ * @param[out]	x	Context to store the private key for x25519 key exchange
+*/
+BCTBX_PUBLIC void bctbx_EDDSA_ECDH_privateKeyConversion(const bctbx_EDDSAContext_t *ed, bctbx_ECDHContext_t *x);
+
+#define BCTBX_ECDH_ISPEER	0
+#define BCTBX_ECDH_ISSELF	1
+
+/**
+ *
+ * @brief Convert a EDDSA public key to a ECDH public key
+ * 	point conversion : montgomeryX = (edwardsY + 1)*inverse(1 - edwardsY) mod p
+ *
+ * @param[in]	ed	Context holding the current public key to convert
+ * @param[out]	x	Context to store the public key for x25519 key exchange
+ * @param[in]	isSelf	Flag to decide where to store the public key in context: BCTBX_ECDH_ISPEER or BCTBX_ECDH_ISPEER
+*/
+BCTBX_PUBLIC void bctbx_EDDSA_ECDH_publicKeyConversion(const bctbx_EDDSAContext_t *ed, bctbx_ECDHContext_t *x, uint8_t isSelf);
+
+/*****************************************************************************/
+/***** Hashing                                                           *****/
+/*****************************************************************************/
+/*
+ * @brief SHA512 wrapper
+ * @param[in]	input 		Input data buffer
+ * @param[in]	inputLength	Input data length in bytes
+ * @param[in]	hashLength	Length of output required in bytes, Output is truncated to the hashLength left bytes. 64 bytes maximum
+ * @param[out]	output		Output data buffer.
+ *
+ */
+BCTBX_PUBLIC void bctbx_sha512(const uint8_t *input,
+		size_t inputLength,
+		uint8_t hashLength,
+		uint8_t *output);
+
+/*
+ * @brief SHA384 wrapper
+ * @param[in]	input 		Input data buffer
+ * @param[in]   inputLength	Input data length in bytes
+ * @param[in]	hashLength	Length of output required in bytes, Output is truncated to the hashLength left bytes. 48 bytes maximum
+ * @param[out]	output		Output data buffer.
+ *
+ */
+BCTBX_PUBLIC void bctbx_sha384(const uint8_t *input,
+		size_t inputLength,
+		uint8_t hashLength,
+		uint8_t *output);
+/**
+ * @brief SHA256 wrapper
+ * @param[in]	input 		Input data buffer
+ * @param[in]   inputLength	Input data length in bytes
+ * @param[in]	hmacLength	Length of output required in bytes, SHA256 output is truncated to the hashLength left bytes. 32 bytes maximum
+ * @param[out]	output		Output data buffer.
+ *
+ */
+BCTBX_PUBLIC void bctbx_sha256(const uint8_t *input,
+		size_t inputLength,
+		uint8_t hashLength,
+		uint8_t *output);
+
+/*
+ * @brief HMAC-SHA512 wrapper
+ * @param[in] 	key		HMAC secret key
+ * @param[in] 	keyLength	HMAC key length
+ * @param[in]	input 		Input data buffer
+ * @param[in]   inputLength	Input data length
+ * @param[in]	hmacLength	Length of output required in bytes, HMAC output is truncated to the hmacLength left bytes. 64 bytes maximum
+ * @param[out]	output		Output data buffer.
+ *
+ */
+BCTBX_PUBLIC void bctbx_hmacSha512(const uint8_t *key,
+		size_t keyLength,
+		const uint8_t *input,
+		size_t inputLength,
+		uint8_t hmacLength,
+		uint8_t *output);
+
+/**
+ * @brief HMAC-SHA384 wrapper
+ * @param[in] 	key		HMAC secret key
+ * @param[in] 	keyLength	HMAC key length in bytes
+ * @param[in]	input 		Input data buffer
+ * @param[in]   inputLength	Input data length in bytes
+ * @param[in]	hmacLength	Length of output required in bytes, HMAC output is truncated to the hmacLength left bytes. 48 bytes maximum
+ * @param[out]	output		Output data buffer.
+ *
+ */
+BCTBX_PUBLIC void bctbx_hmacSha384(const uint8_t *key,
+		size_t keyLength,
+		const uint8_t *input,
+		size_t inputLength,
+		uint8_t hmacLength,
+		uint8_t *output);
+
+/**
+ * @brief HMAC-SHA256 wrapper
+ * @param[in] 	key		HMAC secret key
+ * @param[in] 	keyLength	HMAC key length in bytes
+ * @param[in]	input 		Input data buffer
+ * @param[in]   inputLength	Input data length in bytes
+ * @param[in]	hmacLength	Length of output required in bytes, HMAC output is truncated to the hmacLength left bytes. 32 bytes maximum
+ * @param[out]	output		Output data buffer.
+ *
+ */
+BCTBX_PUBLIC void bctbx_hmacSha256(const uint8_t *key,
+		size_t keyLength,
+		const uint8_t *input,
+		size_t inputLength,
+		uint8_t hmacLength,
+		uint8_t *output);
+
+/**
+ * @brief HMAC-SHA1 wrapper
+ * @param[in] 	key			HMAC secret key
+ * @param[in] 	keyLength	HMAC key length
+ * @param[in]	input 		Input data buffer
+ * @param[in]   inputLength	Input data length
+ * @param[in]	hmacLength	Length of output required in bytes, HMAC output is truncated to the hmacLength left bytes. 20 bytes maximum
+ * @param[out]	output		Output data buffer
+ *
+ */
+BCTBX_PUBLIC void bctbx_hmacSha1(const uint8_t *key,
+		size_t keyLength,
+		const uint8_t *input,
+		size_t inputLength,
+		uint8_t hmacLength,
+		uint8_t *output);
+
+/**
+ * @brief MD5 wrapper
+ * output = md5(input)
+ * @param[in]	input 		Input data buffer
+ * @param[in]   inputLength	Input data length in bytes
+ * @param[out]	output		Output data buffer.
+ *
+ */
+BCTBX_PUBLIC void bctbx_md5(const uint8_t *input,
+		size_t inputLength,
+		uint8_t output[16]);
+
+
+/*****************************************************************************/
+/***** Encryption/Decryption                                             *****/
+/*****************************************************************************/
+typedef struct bctbx_aes_gcm_context_struct bctbx_aes_gcm_context_t;
+/**
+ * @Brief AES-GCM encrypt and tag buffer
+ *
+ * @param[in]	key							Encryption key
+ * @param[in]	keyLength					Key buffer length, in bytes, must be 16,24 or 32
+ * @param[in]	plainText					buffer to be encrypted
+ * @param[in]	plainTextLength				Length in bytes of buffer to be encrypted
+ * @param[in]	authenticatedData			Buffer holding additional data to be used in tag computation
+ * @param[in]	authenticatedDataLength		Additional data length in bytes
+ * @param[in]	initializationVector		Buffer holding the initialisation vector
+ * @param[in]	initializationVectorLength	Initialisation vector length in bytes
+ * @param[out]	tag							Buffer holding the generated tag
+ * @param[in]	tagLength					Requested length for the generated tag
+ * @param[out]	output						Buffer holding the output, shall be at least the length of plainText buffer
+ *
+ * @return 0 on success, crypto library error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_aes_gcm_encrypt_and_tag(const uint8_t *key, size_t keyLength,
+		const uint8_t *plainText, size_t plainTextLength,
+		const uint8_t *authenticatedData, size_t authenticatedDataLength,
+		const uint8_t *initializationVector, size_t initializationVectorLength,
+		uint8_t *tag, size_t tagLength,
+		uint8_t *output);
+
+/**
+ * @Brief AES-GCM decrypt, compute authentication tag and compare it to the one provided
+ *
+ * @param[in]	key							Encryption key
+ * @param[in]	keyLength					Key buffer length, in bytes, must be 16,24 or 32
+ * @param[in]	cipherText					Buffer to be decrypted
+ * @param[in]	cipherTextLength			Length in bytes of buffer to be decrypted
+ * @param[in]	authenticatedData			Buffer holding additional data to be used in auth tag computation
+ * @param[in]	authenticatedDataLength		Additional data length in bytes
+ * @param[in]	initializationVector		Buffer holding the initialisation vector
+ * @param[in]	initializationVectorLength	Initialisation vector length in bytes
+ * @param[in]	tag							Buffer holding the authentication tag
+ * @param[in]	tagLength					Length in bytes for the authentication tag
+ * @param[out]	output						Buffer holding the output, shall be at least the length of cipherText buffer
+ *
+ * @return 0 on succes, BCTBX_ERROR_AUTHENTICATION_FAILED if tag doesn't match or crypto library error code
+ */
+BCTBX_PUBLIC int32_t bctbx_aes_gcm_decrypt_and_auth(const uint8_t *key, size_t keyLength,
+		const uint8_t *cipherText, size_t cipherTextLength,
+		const uint8_t *authenticatedData, size_t authenticatedDataLength,
+		const uint8_t *initializationVector, size_t initializationVectorLength,
+		const uint8_t *tag, size_t tagLength,
+		uint8_t *output);
+
+/**
+ * @Brief create and initialise an AES-GCM encryption context
+ *
+ * @param[in]	key							encryption key
+ * @param[in]	keyLength					key buffer length, in bytes, must be 16,24 or 32
+ * @param[in]	authenticatedData			Buffer holding additional data to be used in tag computation
+ * @param[in]	authenticatedDataLength		additional data length in bytes
+ * @param[in]	initializationVector		Buffer holding the initialisation vector
+ * @param[in]	initializationVectorLength	Initialisation vector length in bytes
+ * @param[in]	mode						Operation mode : BCTBX_GCM_ENCRYPT or BCTBX_GCM_DECRYPT
+ *
+ * @return a pointer to the created context, to be freed using bctbx_aes_gcm_finish()
+ */
+BCTBX_PUBLIC bctbx_aes_gcm_context_t *bctbx_aes_gcm_context_new(const uint8_t *key, size_t keyLength,
+		const uint8_t *authenticatedData, size_t authenticatedDataLength,
+		const uint8_t *initializationVector, size_t initializationVectorLength,
+		uint8_t mode);
+
+/**
+ * @Brief AES-GCM encrypt or decrypt a chunk of data
+ *
+ * @param[in/out]	context			a context already initialized using bctbx_aes_gcm_context_new
+ * @param[in]		input			buffer holding the input data
+ * @param[in]		inputLength		length of the input data
+ * @param[out]		output			buffer to store the output data (same length as input one)
+ *
+ * @return 0 on success, crypto library error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_aes_gcm_process_chunk(bctbx_aes_gcm_context_t *context,
+		const uint8_t *input, size_t inputLength,
+		uint8_t *output);
+
+/**
+ * @Brief Conclude a AES-GCM encryption stream, generate tag if requested, free resources
+ *
+ * @param[in/out]	context			a context already initialized using bctbx_aes_gcm_context_new
+ * @param[out]		tag				a buffer to hold the authentication tag. Can be NULL if tagLength is 0
+ * @param[in]		tagLength		length of reqested authentication tag, max 16
+ *
+ * @return 0 on success, crypto library error code otherwise
+ */
+BCTBX_PUBLIC int32_t bctbx_aes_gcm_finish(bctbx_aes_gcm_context_t *context,
+		uint8_t *tag, size_t tagLength);
+
+
+/**
+ * @brief Wrapper for AES-128 in CFB128 mode encryption
+ * Both key and IV must be 16 bytes long
+ *
+ * @param[in]	key			encryption key, 128 bits long
+ * @param[in]	IV			Initialisation vector, 128 bits long, is not modified by this function.
+ * @param[in]	input		Input data buffer
+ * @param[in]	inputLength	Input data length
+ * @param[out]	output		Output data buffer
+ *
+ */
+BCTBX_PUBLIC void bctbx_aes128CfbEncrypt(const uint8_t *key,
+		const uint8_t *IV,
+		const uint8_t *input,
+		size_t inputLength,
+		uint8_t *output);
+
+/**
+ * @brief Wrapper for AES-128 in CFB128 mode decryption
+ * Both key and IV must be 16 bytes long
+ *
+ * @param[in]	key			decryption key, 128 bits long
+ * @param[in]	IV			Initialisation vector, 128 bits long, is not modified by this function.
+ * @param[in]	input		Input data buffer
+ * @param[in]	inputLength	Input data length
+ * @param[out]	output		Output data buffer
+ *
+ */
+BCTBX_PUBLIC void bctbx_aes128CfbDecrypt(const uint8_t *key,
+		const uint8_t *IV,
+		const uint8_t *input,
+		size_t inputLength,
+		uint8_t *output);
+
+/**
+ * @brief Wrapper for AES-256 in CFB128 mode encryption
+ * The key must be 32 bytes long and the IV must be 16 bytes long
+ *
+ * @param[in]	key			encryption key, 256 bits long
+ * @param[in]	IV			Initialisation vector, 128 bits long, is not modified by this function.
+ * @param[in]	input		Input data buffer
+ * @param[in]	inputLength	Input data length
+ * @param[out]	output		Output data buffer
+ *
+ */
+BCTBX_PUBLIC void bctbx_aes256CfbEncrypt(const uint8_t *key,
+		const uint8_t *IV,
+		const uint8_t *input,
+		size_t inputLength,
+		uint8_t *output);
+
+/**
+ * @brief Wrapper for AES-256 in CFB128 mode decryption
+ * The key must be 32 bytes long and the IV must be 16 bytes long
+ *
+ * @param[in]	key			decryption key, 256 bits long
+ * @param[in]	IV			Initialisation vector, 128 bits long, is not modified by this function.
+ * @param[in]	input		Input data buffer
+ * @param[in]	inputLength	Input data length
+ * @param[out]	output		Output data buffer
+ *
+ */
+BCTBX_PUBLIC void bctbx_aes256CfbDecrypt(const uint8_t *key,
+		const uint8_t *IV,
+		const uint8_t *input,
+		size_t inputLength,
+		uint8_t *output);
+
+/**
+ * @brief encrypt the file in input buffer for linphone encrypted file transfer
+ *
+ * @param[in/out]	cryptoContext	a context already initialized using bctbx_aes_gcm_context_new
+ * @param[in]		key		encryption key
+ * @param[in]		length	buffer size
+ * @param[in]		plain	buffer holding the input data
+ * @param[out]		cipher	buffer to store the output data
+ */
+BCTBX_PUBLIC int bctbx_aes_gcm_encryptFile(void **cryptoContext, unsigned char *key, size_t length, char *plain, char *cipher);
+
+/**
+ * @brief decrypt the file in input buffer for linphone encrypted file transfer
+ *
+ * @param[in/out]	cryptoContext	a context already initialized using bctbx_aes_gcm_context_new
+ * @param[in]		key		encryption key
+ * @param[in]		length	buffer size
+ * @param[out]		plain	buffer holding the output data
+ * @param[int]		cipher	buffer to store the input data
+ */
+BCTBX_PUBLIC int bctbx_aes_gcm_decryptFile(void **cryptoContext, unsigned char *key, size_t length, char *plain, char *cipher);
+
+/*****************************************************************************/
+/***** Cleaning                                                          *****/
+/*****************************************************************************/
+
+/**
+ * @brief force a buffer values to zero in a way that shall prevent the compiler from optimizing it out
+ *
+ * @param[in/out]	buffer	the buffer to be cleared
+ * @param[in]		size	buffer size
+ */
+BCTBX_PUBLIC void bctbx_clean(void *buffer, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BCTBX_CRYPTO_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/defs.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/defs.h"
new file mode 100755
index 0000000..3ac9d29
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/defs.h"
@@ -0,0 +1,34 @@
+/*
+defs.h
+Copyright (C) 2010-2017 Belledonne Communications SARL
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
+
+#ifndef BCTBX_DEFS_H_
+#define BCTBX_DEFS_H_
+
+/* Macro telling GCC that a 'break' statement has been deliberately omitted
+ * in switch block */
+#ifndef BCTBX_NO_BREAK
+#if defined(__GNUC__) && __GNUC__ >= 7
+#define BCTBX_NO_BREAK __attribute__((fallthrough))
+#else
+#define BCTBX_NO_BREAK
+#endif // __GNUC__
+#endif // BCTBX_NO_BREAK
+
+
+#endif /* BCTBX_DEFS_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/exception.hh" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/exception.hh"
new file mode 100755
index 0000000..d79ba15
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/exception.hh"
@@ -0,0 +1,83 @@
+/*
+	bctoolbox
+	Copyright (C) 2016  Belledonne Communications SARL.
+
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU Affero General Public License as
+	published by the Free Software Foundation, either version 3 of the
+	License, or (at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU Affero General Public License for more details.
+
+	You should have received a copy of the GNU Affero General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef exception_h
+#define exception_h
+
+#include <exception>
+#include <sstream>
+
+#include "bctoolbox/port.h"
+
+#ifdef _WIN32
+#pragma warning (push)
+#pragma warning (disable : 4275 4251)
+#endif
+
+/**
+* @brief General pupose exception saving backtrace.
+*
+* sample of use:
+* try {
+*		throw BCTBX_EXCEPTION << "Hello, this is my exception";
+* } catch (BctbxException e&) {
+*    BCTOOLBOX_SLOGD("mylogdomain") << "Exception cauth"<< e;
+* }
+*
+*
+*/
+class BCTBX_PUBLIC BctbxException : public std::exception {
+public:
+	BctbxException(const std::string &message = "");
+	BctbxException(const BctbxException &other);
+	virtual ~BctbxException() = default;
+
+	/**
+	 * print stack strace to stderr
+	 * */
+	void printStackTrace() const;
+
+	void printStackTrace(std::ostream &os) const;
+
+	const char *what() const noexcept override;
+
+	const std::string& str() const;
+
+	/* same as osstringstream, but as osstream does not have cp contructor, BctbxException can't inherit from
+	 * osstream*/
+	template <typename T2> BctbxException &operator<<(const T2 &val) {
+		mOs << val;
+		return *this;
+	}
+
+private:
+	void *mArray[20];
+	size_t mSize;
+	std::ostringstream mOs;
+	mutable std::string mMessage;
+};
+
+BCTBX_PUBLIC std::ostream &operator<<(std::ostream &__os, const BctbxException &e);
+
+#define BCTBX_EXCEPTION BctbxException() << " " << __FILE__ << ":" << __LINE__ << " "
+
+#ifdef _WIN32
+#pragma warning (pop)
+#endif
+
+#endif /* exception_h */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/list.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/list.h"
new file mode 100755
index 0000000..6c97ceb
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/list.h"
@@ -0,0 +1,89 @@
+/*
+    bctoolbox
+    Copyright (C) 2016  Belledonne Communications SARL
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BCTBX_LIST_H_
+#define BCTBX_LIST_H_
+
+#include "bctoolbox/port.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct _bctbx_list {
+	struct _bctbx_list *next;
+	struct _bctbx_list *prev;
+	void *data;
+} bctbx_list_t;
+
+typedef int (*bctbx_compare_func)(const void *, const void*);
+typedef void (*bctbx_list_iterate_func)(void *);
+typedef void (*bctbx_list_iterate2_func)(void *, void *);
+typedef void (*bctbx_list_free_func)(void *);
+typedef void* (*bctbx_list_copy_func)(void *);
+
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_new(void *data);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_append(bctbx_list_t * elem, void * data);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_append_link(bctbx_list_t * elem, bctbx_list_t *new_elem);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_prepend(bctbx_list_t * elem, void * data);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_prepend_link(bctbx_list_t* elem, bctbx_list_t *new_elem);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_last_elem(const bctbx_list_t *l);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_first_elem(const bctbx_list_t *l);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_free(bctbx_list_t * elem);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_concat(bctbx_list_t * first, bctbx_list_t * second);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_remove(bctbx_list_t * first, void *data);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_remove_custom(bctbx_list_t *first, bctbx_compare_func compare_func, const void *user_data);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_pop_front(bctbx_list_t *list, void **front_data);
+BCTBX_PUBLIC size_t bctbx_list_size(const bctbx_list_t * first);
+BCTBX_PUBLIC void bctbx_list_for_each(const bctbx_list_t * list, bctbx_list_iterate_func func);
+BCTBX_PUBLIC void bctbx_list_for_each2(const bctbx_list_t * list, bctbx_list_iterate2_func func, void *user_data);
+/**
+ * Removes the element pointed by elem from the list. The element itself is not freed, allowing 
+ * to be chained in another list for example.
+ * Use bctbx_list_erase_link() if you simply want to delete an element of a list.
+**/
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_unlink(bctbx_list_t * list, bctbx_list_t * elem);
+/**
+ * Delete the element pointed by 'elem' from the list.
+**/
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_erase_link(bctbx_list_t * list, bctbx_list_t * elem);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_find(bctbx_list_t *list, const void *data);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_free(bctbx_list_t *list);
+/*frees list elements and associated data, using the supplied function pointer*/
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_free_with_data(bctbx_list_t *list, bctbx_list_free_func freefunc);
+
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_find_custom(const bctbx_list_t * list, bctbx_compare_func cmp, const void *user_data);
+BCTBX_PUBLIC void * bctbx_list_nth_data(const bctbx_list_t * list, int index);
+BCTBX_PUBLIC int bctbx_list_position(const bctbx_list_t * list, bctbx_list_t * elem);
+BCTBX_PUBLIC int bctbx_list_index(const bctbx_list_t * list, void *data);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_insert_sorted(bctbx_list_t * list, void *data, bctbx_compare_func cmp);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_insert(bctbx_list_t * list, bctbx_list_t * before, void *data);
+BCTBX_PUBLIC bctbx_list_t * bctbx_list_copy(const bctbx_list_t * list);
+/*copy list elements and associated data, using the supplied function pointer*/
+BCTBX_PUBLIC bctbx_list_t* bctbx_list_copy_with_data(const bctbx_list_t* list, bctbx_list_copy_func copyfunc);
+/*Same as bctbx_list_copy_with_data but in reverse order*/
+BCTBX_PUBLIC bctbx_list_t* bctbx_list_copy_reverse_with_data(const bctbx_list_t* list, bctbx_list_copy_func copyfunc);
+
+BCTBX_PUBLIC bctbx_list_t* bctbx_list_next(const bctbx_list_t *elem);
+BCTBX_PUBLIC void* bctbx_list_get_data(const bctbx_list_t *elem);
+	
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BCTLBX_LIST_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/logging.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/logging.h"
new file mode 100755
index 0000000..1bbe2b3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/logging.h"
@@ -0,0 +1,346 @@
+/*
+  bctoolobx
+  Copyright (C) 2016 Belledonne Communications, France, Grenoble
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+/**
+ * \file logging.h
+ * \brief Logging API.
+ *
+**/
+
+#ifndef BCTBX_LOGGING_H
+#define BCTBX_LOGGING_H
+
+#include <bctoolbox/port.h>
+#include "bctoolbox/list.h"
+
+
+/**
+ * The BCTBX_LOG_DOMAIN macro should be defined with a preprocessor directive (ex: -DBCTBX_LOG_DOMAIN="my-component") in every
+ * software entity (application, library, sub-parts of software etc) using the bctoolbox log facility, so that all invocations of the
+ * bctbx_message(), bctbx_warning(), bctbx_error(), bctbx_fatal() outputs their log within the domain title of the software part there are compiled in.
+ * It SHALL not be defined in any public header, otherwise it will conflict with upper layer using the logging facility for their own domain.
+ * As a special exception, bctoolbox defines the log domain to be "bctbx" if no preprocessor directive defines it.
+ * As a result, bctboolbox owns logs will be output into the "bctbx" domain.
+**/
+#ifndef BCTBX_LOG_DOMAIN
+#define BCTBX_LOG_DOMAIN "bctbx"
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef enum {
+	BCTBX_LOG_DEBUG=1,
+	BCTBX_LOG_TRACE=1<<1,
+	BCTBX_LOG_MESSAGE=1<<2,
+	BCTBX_LOG_WARNING=1<<3,
+	BCTBX_LOG_ERROR=1<<4,
+	BCTBX_LOG_FATAL=1<<5,
+	BCTBX_LOG_LOGLEV_END=1<<6
+} BctbxLogLevel;
+
+typedef struct _bctbx_log_handler_t bctbx_log_handler_t;
+
+typedef void (*BctbxLogFunc)(const char *domain, BctbxLogLevel lev, const char *fmt, va_list args);
+typedef void (*BctbxLogHandlerFunc)(void *info,const char *domain, BctbxLogLevel lev, const char *fmt, va_list args);
+typedef void (*BctbxLogHandlerDestroyFunc)(bctbx_log_handler_t *handler);
+
+/*
+ initialise logging functions, add default log handler for stdout output.
+ @param[in] bool_t create : No longer used, always created with a default logger to stdout.
+ */
+BCTBX_PUBLIC void bctbx_init_logger(bool_t create);
+
+/*
+ free logging memory
+ */
+BCTBX_PUBLIC void bctbx_uninit_logger(void);
+
+/*
+ Default functions to free log handlers
+ @param[in] bctbx_log_handler_t* handler : the handler to free
+*/
+BCTBX_PUBLIC void bctbx_logv_out_destroy(bctbx_log_handler_t *handler);
+BCTBX_PUBLIC void bctbx_logv_file_destroy(bctbx_log_handler_t *handler);
+
+/*
+ Function to create a log handler
+ @param[in] BctbxLogHandlerFunc func : the function to call to handle a new line of log
+ @param[in] BctbxLogHandlerDestroyFunc destroy : the function to call to free this handler particuler its user_info field
+ @param[in] void* user_info : complementary information to handle the logs if needed
+ @return a new bctbx_log_handler_t
+*/
+BCTBX_PUBLIC bctbx_log_handler_t* bctbx_create_log_handler(BctbxLogHandlerFunc func, BctbxLogHandlerDestroyFunc destroy, void* user_data);
+
+/*
+ Function to create a file log handler
+ @param[in] uint64_t max_size : the maximum size of the log file before rotating to a new one (if 0 then no rotation)
+ @param[in] const char* path : the path where to put the log files
+ @param[in] const char* name : the name of the log files
+ @param[in] FILE* f : the file where to write the logs
+ @return a new bctbx_log_handler_t
+*/
+BCTBX_PUBLIC bctbx_log_handler_t* bctbx_create_file_log_handler(uint64_t max_size, const char* path, const char* name);
+
+/**
+ * @brief Request reopening of the log file.
+ * @param[in] file_log_handler The log handler whose file will be reopened.
+ * @note This function is thread-safe and reopening is done asynchronously.
+ */
+BCTBX_PUBLIC void bctbx_file_log_handler_reopen(bctbx_log_handler_t *file_log_handler);
+
+/* set domain the handler is limited to. NULL for ALL*/
+BCTBX_PUBLIC void bctbx_log_handler_set_domain(bctbx_log_handler_t * log_handler,const char *domain);
+BCTBX_PUBLIC void bctbx_log_handler_set_user_data(bctbx_log_handler_t*, void* user_data);
+BCTBX_PUBLIC void *bctbx_log_handler_get_user_data(const bctbx_log_handler_t* log_handler);
+
+BCTBX_PUBLIC void bctbx_add_log_handler(bctbx_log_handler_t* handler);
+BCTBX_PUBLIC void bctbx_remove_log_handler(bctbx_log_handler_t* handler);
+
+/*
+ * Set a callback function to render logs for the default handler.
+ */
+BCTBX_PUBLIC void bctbx_set_log_handler(BctbxLogFunc func);
+/*
+ * Same as bctbx_set_log_handler but only for a domain. NULL for all.
+ * Be careful that if domain is specified, the default log handler will no longer output logs for other domains.
+ */
+BCTBX_PUBLIC void bctbx_set_log_handler_for_domain(BctbxLogFunc func, const char* domain);
+/*Convenient function that creates a static log handler logging into supplied FILE argument.
+ Despite it is not recommended to use it in libraries, it can be useful for simple test programs.*/
+BCTBX_PUBLIC void bctbx_set_log_file(FILE* f);
+BCTBX_PUBLIC bctbx_list_t* bctbx_get_log_handlers(void);
+
+BCTBX_PUBLIC void bctbx_logv_out(const char *domain, BctbxLogLevel level, const char *fmt, va_list args);
+BCTBX_PUBLIC void bctbx_logv_file(void* user_info, const char *domain, BctbxLogLevel level, const char *fmt, va_list args);
+
+/*
+ * Returns 1 if the log level 'level' is enabled for the calling thread, otherwise 0.
+ * This gives the condition to decide to output a log.
+ */
+BCTBX_PUBLIC int bctbx_log_level_enabled(const char *domain, BctbxLogLevel level);
+
+BCTBX_PUBLIC void bctbx_logv(const char *domain, BctbxLogLevel level, const char *fmt, va_list args);
+
+/**
+ * Flushes the log output queue.
+ * WARNING: Must be called from the thread that has been defined with bctbx_set_log_thread_id().
+ */
+BCTBX_PUBLIC void bctbx_logv_flush(void);
+
+/**
+ * Activate all log level greater or equal than specified level argument.
+**/
+BCTBX_PUBLIC void bctbx_set_log_level(const char *domain, BctbxLogLevel level);
+
+BCTBX_PUBLIC void bctbx_set_log_level_mask(const char *domain, int levelmask);
+BCTBX_PUBLIC unsigned int bctbx_get_log_level_mask(const char *domain);
+
+/**
+ * Set a specific log level for the calling thread for domain.
+ * When domain is NULL, the log level applies to all domains.
+ */
+BCTBX_PUBLIC void bctbx_set_thread_log_level(const char *domain, BctbxLogLevel level);
+
+/**
+ * Clears the specific log level set for the calling thread by bctbx_set_thread_log_level().
+ * After calling this function, the global (not per thread) log level will apply to 
+ * logs printed by this thread.
+ */
+BCTBX_PUBLIC void bctbx_clear_thread_log_level(const char *domain);
+
+/**
+ * Tell oRTP the id of the thread used to output the logs.
+ * This is meant to output all the logs from the same thread to prevent deadlock problems at the application level.
+ * @param[in] thread_id The id of the thread that will output the logs (can be obtained using bctbx_thread_self()).
+ */
+BCTBX_PUBLIC void bctbx_set_log_thread_id(unsigned long thread_id);
+
+#ifdef __GNUC__
+#define CHECK_FORMAT_ARGS(m,n) __attribute__((format(printf,m,n)))
+#else
+#define CHECK_FORMAT_ARGS(m,n)
+#endif
+#ifdef __clang__
+/*in case of compile with -g static inline can produce this type of warning*/
+#pragma GCC diagnostic ignored "-Wunused-function"
+#endif
+#ifdef BCTBX_DEBUG_MODE
+static BCTBX_INLINE void CHECK_FORMAT_ARGS(1,2) bctbx_debug(const char *fmt,...)
+{
+  va_list args;
+  va_start (args, fmt);
+  bctbx_logv(BCTBX_LOG_DOMAIN, BCTBX_LOG_DEBUG, fmt, args);
+  va_end (args);
+}
+#else
+
+#define bctbx_debug(...)
+
+#endif
+
+#ifdef BCTBX_NOMESSAGE_MODE
+
+#define bctbx_log(...)
+#define bctbx_message(...)
+#define bctbx_warning(...)
+
+#else
+
+static BCTBX_INLINE void bctbx_log(const char* domain, BctbxLogLevel lev, const char *fmt,...) {
+	va_list args;
+	va_start (args, fmt);
+	bctbx_logv(domain, lev, fmt, args);
+	va_end (args);
+}
+
+static BCTBX_INLINE void CHECK_FORMAT_ARGS(1,2) bctbx_message(const char *fmt,...)
+{
+	va_list args;
+	va_start (args, fmt);
+	bctbx_logv(BCTBX_LOG_DOMAIN, BCTBX_LOG_MESSAGE, fmt, args);
+	va_end (args);
+}
+
+static BCTBX_INLINE void CHECK_FORMAT_ARGS(1,2) bctbx_warning(const char *fmt,...)
+{
+	va_list args;
+	va_start (args, fmt);
+	bctbx_logv(BCTBX_LOG_DOMAIN, BCTBX_LOG_WARNING, fmt, args);
+	va_end (args);
+}
+
+#endif
+
+static BCTBX_INLINE void CHECK_FORMAT_ARGS(1,2) bctbx_error(const char *fmt,...)
+{
+	va_list args;
+	va_start (args, fmt);
+	bctbx_logv(BCTBX_LOG_DOMAIN, BCTBX_LOG_ERROR, fmt, args);
+	va_end (args);
+}
+
+static BCTBX_INLINE void CHECK_FORMAT_ARGS(1,2) bctbx_fatal(const char *fmt,...)
+{
+	va_list args;
+	va_start (args, fmt);
+	bctbx_logv(BCTBX_LOG_DOMAIN, BCTBX_LOG_FATAL, fmt, args);
+	va_end (args);
+}
+
+
+#ifdef __QNX__
+void bctbx_qnx_log_handler(const char *domain, BctbxLogLevel lev, const char *fmt, va_list args);
+#endif
+
+
+#ifdef __cplusplus
+}
+
+#include <string>
+#include <iostream>
+#include <sstream>
+
+#if !defined(_WIN32) && !defined(__QNX__)
+#include <syslog.h>
+#endif
+
+namespace bctoolbox {
+	namespace log {
+
+		// Here we define our application severity levels.
+		enum level { normal, trace, debug, info, warning, error, fatal };
+
+		// The formatting logic for the severity level
+		template <typename CharT, typename TraitsT>
+		inline std::basic_ostream<CharT, TraitsT> &operator<<(std::basic_ostream<CharT, TraitsT> &strm,
+															  const bctoolbox::log::level &lvl) {
+			static const char *const str[] = {"normal", "trace", "debug", "info", "warning", "error", "fatal"};
+			if (static_cast<std::size_t>(lvl) < (sizeof(str) / sizeof(*str)))
+				strm << str[lvl];
+			else
+				strm << static_cast<int>(lvl);
+			return strm;
+		}
+
+		template <typename CharT, typename TraitsT>
+		inline std::basic_istream<CharT, TraitsT> &operator>>(std::basic_istream<CharT, TraitsT> &strm,
+															  bctoolbox::log::level &lvl) {
+			static const char *const str[] = {"normal", "trace", "debug", "info", "warning", "error", "fatal"};
+
+			std::string s;
+			strm >> s;
+			for (unsigned int n = 0; n < (sizeof(str) / sizeof(*str)); ++n) {
+				if (s == str[n]) {
+					lvl = static_cast<bctoolbox::log::level>(n);
+					return strm;
+				}
+			}
+			// Parse error
+			strm.setstate(std::ios_base::failbit);
+			return strm;
+		}
+	}
+}
+
+
+
+#include <ostream>
+
+class pumpstream : public std::ostringstream {
+public:
+	/*contructor used to disable logging*/
+	pumpstream():mDomain(""),mLevel(BCTBX_LOG_DEBUG),mTraceEnabled(false){}
+	pumpstream(const char *domain, BctbxLogLevel level) : mDomain(domain ? domain : ""), mLevel(level),mTraceEnabled(true) {}
+	~pumpstream() {
+		const char *domain = mDomain.empty() ? NULL : mDomain.c_str();
+		if (mTraceEnabled && bctbx_log_level_enabled(domain, mLevel))
+			bctbx_log(domain, mLevel, "%s", str().c_str());
+	}
+
+private:
+	const std::string mDomain;
+	const BctbxLogLevel mLevel;
+	const bool mTraceEnabled;
+};
+
+
+#if (__GNUC__ == 4 && __GNUC_MINOR__ < 5 && __cplusplus > 199711L)
+template <typename _Tp> inline pumpstream &operator<<(pumpstream &&__os, const _Tp &__x) {
+	(static_cast<std::ostringstream &>(__os)) << __x;
+	return __os;
+}
+#endif
+
+#define BCTBX_SLOG(domain, thelevel) pumpstream(domain, thelevel)
+
+#ifndef BCTBX_DEBUG_MODE
+#define BCTBX_SLOGD BCTBX_SLOG(BCTBX_LOG_DOMAIN, BCTBX_LOG_DEBUG)
+#else
+#define BCTBX_SLOGD pumpstream()
+#endif
+
+#define BCTBX_SLOGI BCTBX_SLOG(BCTBX_LOG_DOMAIN, BCTBX_LOG_MESSAGE)
+#define BCTBX_SLOGW BCTBX_SLOG(BCTBX_LOG_DOMAIN, BCTBX_LOG_WARNING)
+#define BCTBX_SLOGE BCTBX_SLOG(BCTBX_LOG_DOMAIN, BCTBX_LOG_ERROR)
+
+#endif
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/map.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/map.h"
new file mode 100755
index 0000000..258070c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/map.h"
@@ -0,0 +1,112 @@
+/*
+    bctoolbox mmap
+    Copyright (C) 2016  Belledonne Communications SARL
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BCTBX_MMAP_H_
+#define BCTBX_MMAP_H_
+#include "bctoolbox/list.h"
+#include "bctoolbox/port.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef struct _bctbx_map_t bctbx_map_t;
+typedef struct _bctbx_pair_t bctbx_pair_t;
+typedef struct _bctbx_iterator_t bctbx_iterator_t;
+
+typedef struct _bctbx_mmap_ullong_t bctbx_mmap_ullong_t;
+typedef struct _bctbx_mmap_cchar_t bctbx_mmap_cchar_t;
+	
+typedef void (*bctbx_map_free_func)(void *);
+/*map*/
+BCTBX_PUBLIC bctbx_map_t *bctbx_mmap_ullong_new(void);
+BCTBX_PUBLIC bctbx_map_t *bctbx_mmap_cchar_new(void);
+BCTBX_PUBLIC void bctbx_mmap_ullong_delete(bctbx_map_t *mmap);
+BCTBX_PUBLIC void bctbx_mmap_cchar_delete(bctbx_map_t *mmap);
+BCTBX_PUBLIC void bctbx_mmap_ullong_delete_with_data(bctbx_map_t *mmap, bctbx_map_free_func freefunc);
+BCTBX_PUBLIC void bctbx_mmap_cchar_delete_with_data(bctbx_map_t *mmap, bctbx_map_free_func freefunc);
+#define bctbx_map_insert bctbx_map_ullong_insert
+BCTBX_PUBLIC void bctbx_map_ullong_insert(bctbx_map_t *map,const bctbx_pair_t *pair);
+BCTBX_PUBLIC void bctbx_map_cchar_insert(bctbx_map_t *map,const bctbx_pair_t *pair);
+/*same as insert, but also deleting pair*/
+#define bctbx_map_insert_and_delete bctbx_map_ullong_insert_and_delete
+BCTBX_PUBLIC void bctbx_map_ullong_insert_and_delete(bctbx_map_t *map,bctbx_pair_t *pair);
+BCTBX_PUBLIC void bctbx_map_cchar_insert_and_delete(bctbx_map_t *map,bctbx_pair_t *pair);
+/*same as insert and deleting pair with a newly allocated it returned */
+#define bctbx_map_insert_and_delete_with_returned_it bctbx_map_ullong_insert_and_delete_with_returned_it
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_ullong_insert_and_delete_with_returned_it(bctbx_map_t *map,bctbx_pair_t *pair);
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_cchar_insert_and_delete_with_returned_it(bctbx_map_t *map,bctbx_pair_t *pair);
+/*at return, it point to the next element*/
+#define bctbx_map_erase bctbx_map_ullong_erase
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_ullong_erase(bctbx_map_t *map,bctbx_iterator_t *it);
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_cchar_erase(bctbx_map_t *map,bctbx_iterator_t *it);
+/*return a new allocated iterator*/
+#define bctbx_map_begin bctbx_map_ullong_begin
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_ullong_begin(const bctbx_map_t *map);
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_cchar_begin(const bctbx_map_t *map);
+/*return a new allocated iterator*/
+#define bctbx_map_end bctbx_map_ullong_end
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_ullong_end(const bctbx_map_t *map);
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_map_cchar_end(const bctbx_map_t *map);
+/*return a new allocated iterator or null*/
+#define bctbx_map_find_custom bctbx_map_ullong_find_custom
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_ullong_find_custom(bctbx_map_t *map, bctbx_compare_func compare_func, const void *user_data);
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_cchar_find_custom(bctbx_map_t *map, bctbx_compare_func compare_func, const void *user_data);
+/*return the iterator associated to the key in the map or Null*/
+BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_ullong_find_key(bctbx_map_t *map, unsigned long long key);
+	BCTBX_PUBLIC bctbx_iterator_t * bctbx_map_cchar_find_key(bctbx_map_t *map, const char * key);
+/* return the size of the map*/
+#define bctbx_map_size bctbx_map_ullong_size
+BCTBX_PUBLIC size_t bctbx_map_ullong_size(const bctbx_map_t *map);
+BCTBX_PUBLIC size_t bctbx_map_cchar_size(const bctbx_map_t *map);
+
+/*iterator*/
+#define bctbx_iterator_get_pair bctbx_iterator_ullong_get_pair
+BCTBX_PUBLIC bctbx_pair_t *bctbx_iterator_ullong_get_pair(const bctbx_iterator_t *it);
+BCTBX_PUBLIC bctbx_pair_t *bctbx_iterator_cchar_get_pair(const bctbx_iterator_t *it);
+/*return same pointer but pointing to next*/
+#define bctbx_iterator_get_next bctbx_iterator_ullong_get_next
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_iterator_ullong_get_next(bctbx_iterator_t *it);
+BCTBX_PUBLIC bctbx_iterator_t *bctbx_iterator_cchar_get_next(bctbx_iterator_t *it);
+#define bctbx_iterator_equals bctbx_iterator_ullong_equals
+BCTBX_PUBLIC  bool_t bctbx_iterator_ullong_equals(const bctbx_iterator_t *a,const bctbx_iterator_t *b);
+BCTBX_PUBLIC  bool_t bctbx_iterator_cchar_equals(const bctbx_iterator_t *a,const bctbx_iterator_t *b);
+#define bctbx_iterator_delete bctbx_iterator_ullong_delete
+BCTBX_PUBLIC void bctbx_iterator_ullong_delete(bctbx_iterator_t *it);
+BCTBX_PUBLIC void bctbx_iterator_cchar_delete(bctbx_iterator_t *it);
+	
+/*pair*/	
+typedef struct _bctbx_pair_ullong_t bctbx_pair_ullong_t; /*inherit from bctbx_pair_t*/
+BCTBX_PUBLIC bctbx_pair_ullong_t * bctbx_pair_ullong_new(unsigned long long key,void *value);
+typedef struct _bctbx_pair_cchar_t bctbx_pair_cchar_t; /*inherit from bctbx_pair_t*/
+BCTBX_PUBLIC bctbx_pair_cchar_t * bctbx_pair_cchar_new(const char * key,void *value);
+
+#define bctbx_pair_get_second bctbx_pair_ullong_get_second
+BCTBX_PUBLIC void* bctbx_pair_ullong_get_second(const bctbx_pair_t * pair);
+BCTBX_PUBLIC void* bctbx_pair_cchar_get_second(const bctbx_pair_t * pair);
+BCTBX_PUBLIC unsigned long long bctbx_pair_ullong_get_first(const bctbx_pair_ullong_t * pair);
+BCTBX_PUBLIC const char * bctbx_pair_cchar_get_first(const bctbx_pair_cchar_t * pair);
+#define bctbx_pair_delete bctbx_pair_ullong_delete
+BCTBX_PUBLIC void bctbx_pair_ullong_delete(bctbx_pair_t * pair);
+BCTBX_PUBLIC void bctbx_pair_cchar_delete(bctbx_pair_t * pair);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BCTBX_LIST_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/parser.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/parser.h"
new file mode 100755
index 0000000..1e1c9d4
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/parser.h"
@@ -0,0 +1,94 @@
+/*
+    bctoolbox
+    Copyright (C) 2017  Belledonne Communications SARL
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BCTBX_PARSER_H_
+#define BCTBX_PARSER_H_
+
+#include "bctoolbox/port.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/**
+ * A 256 entries table where each entries defines if character corresponding to its index is allowed  or not (value = 0)
+ * for instance noescape_rules[':'] = 1 means that  ':' should not be escaped
+ */
+typedef  unsigned char bctbx_noescape_rules_t[256+1]; /*last entry (BCTBX_NOESCAPE_RULES_USER_INDEX) is reserved for user purpose. Might be usefull to set if array was initialed of not */
+	
+#define BCTBX_NOESCAPE_RULES_USER_INDEX (sizeof(bctbx_noescape_rules_t) -1)
+/**
+ * Allocate a new string with unauthorized characters escaped (I.E replaced by % HEX HEX) if any.
+ * sample:
+ * bctbx_noescape_rules_t my_rules = {0}; nothing allowed
+ * bctbx_noescape_rules_add_alfanums(my_rules);
+ * char * my_escaped_string = bctbx_escape("Fran莽ois",my_rules);
+ * expeted result my_escaped_string == Fran%c3%a7ois
+ * @param  buff  NULL terminated input buffer.
+ * @param  noescape_rules bctbx_noescape_rules_t to apply for this input buff
+
+ * @return a newly allocated null terminated string
+ */
+BCTBX_PUBLIC char* bctbx_escape(const char* buff, const bctbx_noescape_rules_t noescape_rules);
+
+/**
+ * Add a list of allowed charaters to a noescape rule.
+ * @param  noescape_rules rule to be modified.
+ * @param  allowed string representing allowed char. Sample:  ";-/" 
+ */
+BCTBX_PUBLIC void bctbx_noescape_rules_add_list(bctbx_noescape_rules_t noescape_rules, const char *allowed);
+
+/**
+ * Add a range of allowed charaters to noescape rule. bctbx_noescape_rules_add_range(noescape_rules, '0','9') is the same as bctbx_noescape_rules_add_list(noescape_rules,"0123456789")
+ * @param noescape_rules rule to be modified.
+ * @param first allowed char.
+ * @param last allowed char.
+ */
+BCTBX_PUBLIC void bctbx_noescape_rules_add_range(bctbx_noescape_rules_t noescape_rules, char first, char last);
+/**
+ * Add ['0'..'9'], ['a'..'z'] ['A'..'z'] to no escape rule. 
+ */
+BCTBX_PUBLIC void bctbx_noescape_rules_add_alfanums(bctbx_noescape_rules_t noescape_rules);
+
+/**
+ * Allocate a new string with escaped character (I.E % HEX HEX) replaced by unicode char.
+ * @param  buff  NULL terminated input buffer.
+ * @return a newly allocated null terminated string with unescated values.
+ */
+BCTBX_PUBLIC char* bctbx_unescaped_string(const char* buff);
+
+	
+/**
+ *Convert a single input "a" into unscaped output if need.
+ * a = "%c3%a7" into "莽" with return value = 3
+ * a = "A" into "A" with return value = 1
+ * @param a input value
+ * @param out outbut buffer for conversion
+ * @return number of byte wrote into out
+ */
+BCTBX_PUBLIC size_t bctbx_get_char (const char *a, char *out);
+	
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*BCTBX_PARSER_H_*/
+
+
+
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/port.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/port.h"
new file mode 100755
index 0000000..a736ede
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/port.h"
@@ -0,0 +1,691 @@
+/*
+  The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.
+  Copyright (C) 2001  Simon MORLAT simon.morlat@linphone.org
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+/* this file is responsible of the portability of the stack */
+
+#ifndef BCTBX_PORT_H
+#define BCTBX_PORT_H
+
+
+#if !defined(_WIN32) && !defined(_WIN32_WCE)
+/********************************/
+/* definitions for UNIX flavour */
+/********************************/
+
+#include <errno.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <wchar.h>
+
+#ifdef __linux
+#include <stdint.h>
+#endif
+
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#if defined(_XOPEN_SOURCE_EXTENDED) || !defined(__hpux)
+#include <arpa/inet.h>
+#endif
+
+#include <sys/time.h>
+#include <netdb.h>
+
+
+typedef int bctbx_socket_t;
+typedef pthread_t bctbx_thread_t;
+typedef pthread_mutex_t bctbx_mutex_t;
+typedef pthread_cond_t bctbx_cond_t;
+
+#ifdef __INTEL_COMPILER
+#pragma warning(disable : 111)		// statement is unreachable
+#pragma warning(disable : 181)		// argument is incompatible with corresponding format string conversion
+#pragma warning(disable : 188)		// enumerated type mixed with another type
+#pragma warning(disable : 593)		// variable "xxx" was set but never used
+#pragma warning(disable : 810)		// conversion from "int" to "unsigned short" may lose significant bits
+#pragma warning(disable : 869)		// parameter "xxx" was never referenced
+#pragma warning(disable : 981)		// operands are evaluated in unspecified order
+#pragma warning(disable : 1418)		// external function definition with no prior declaration
+#pragma warning(disable : 1419)		// external declaration in primary source file
+#pragma warning(disable : 1469)		// "cc" clobber ignored
+#endif
+
+#ifndef BCTBX_DEPRECATED
+#define BCTBX_DEPRECATED __attribute__ ((deprecated))
+#endif
+
+#define BCTBX_PUBLIC
+#define BCTBX_INLINE			inline
+#define BCTBX_EWOULDBLOCK	EWOULDBLOCK
+#define BCTBX_EINPROGRESS	EINPROGRESS
+#define BCTBX_ENETUNREACH	ENETUNREACH
+#define BCTBX_EHOSTUNREACH	EHOSTUNREACH
+#define BCTBX_ENOTCONN		ENOTCONN
+#define BCTBX_EPROTOTYPE	EPROTOTYPE /* Protocol wrong type for socket */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+int __bctbx_thread_join(bctbx_thread_t thread, void **ptr);
+int __bctbx_thread_create(bctbx_thread_t *thread, pthread_attr_t *attr, void * (*routine)(void*), void *arg);
+unsigned long __bctbx_thread_self(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define bctbx_thread_create    __bctbx_thread_create
+#define bctbx_thread_join      __bctbx_thread_join
+#define bctbx_thread_self      __bctbx_thread_self
+#define bctbx_thread_exit      pthread_exit
+#define bctbx_mutex_init       pthread_mutex_init
+#define bctbx_mutex_lock       pthread_mutex_lock
+#define bctbx_mutex_unlock     pthread_mutex_unlock
+#define bctbx_mutex_destroy    pthread_mutex_destroy
+#define bctbx_cond_init        pthread_cond_init
+#define bctbx_cond_signal      pthread_cond_signal
+#define bctbx_cond_broadcast   pthread_cond_broadcast
+#define bctbx_cond_wait        pthread_cond_wait
+#define bctbx_cond_destroy     pthread_cond_destroy
+#define bctbx_inet_aton        inet_aton
+
+#define SOCKET_OPTION_VALUE	void *
+#define SOCKET_BUFFER		void *
+
+#define getSocketError() strerror(errno)
+#define getSocketErrorCode() (errno)
+#define bctbx_gettimeofday(tv,tz) gettimeofday(tv,tz)
+#define bctbx_log10f(x)	log10f(x)
+
+
+#else
+/*********************************/
+/* definitions for WIN32 flavour */
+/*********************************/
+
+#include <stdio.h>
+#define _CRT_RAND_S
+#include <stdlib.h>
+#include <stdarg.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#ifdef _MSC_VER
+#include <io.h>
+#endif
+
+#if defined(__MINGW32__) || !defined(WINAPI_FAMILY_PARTITION) || !defined(WINAPI_PARTITION_DESKTOP)
+#define BCTBX_WINDOWS_DESKTOP 1
+#elif defined(WINAPI_FAMILY_PARTITION)
+#if defined(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+#define BCTBX_WINDOWS_DESKTOP 1
+#elif defined(WINAPI_PARTITION_PHONE_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
+#define BCTBX_WINDOWS_PHONE 1
+#elif defined(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+#define BCTBX_WINDOWS_UNIVERSAL 1
+#endif
+#endif
+
+#ifndef BCTBX_DEPRECATED
+#define BCTBX_DEPRECATED __declspec(deprecated)
+#endif
+
+#if defined(_WIN32) || defined(_WIN32_WCE)
+#ifdef BCTBX_STATIC
+#define BCTBX_PUBLIC
+#define BCTBX_VAR_PUBLIC extern
+#else
+#ifdef BCTBX_EXPORTS
+#define BCTBX_PUBLIC	__declspec(dllexport)
+#define BCTBX_VAR_PUBLIC    extern __declspec(dllexport)
+#else
+#define BCTBX_PUBLIC	__declspec(dllimport)
+#define BCTBX_VAR_PUBLIC    __declspec(dllimport)
+#endif
+#endif
+
+#pragma push_macro("_WINSOCKAPI_")
+#ifndef _WINSOCKAPI_
+#define _WINSOCKAPI_
+#endif
+
+#define strtok_r strtok_s
+
+typedef  unsigned __int64 uint64_t;
+typedef  __int64 int64_t;
+typedef  unsigned short uint16_t;
+typedef  unsigned int uint32_t;
+typedef  int int32_t;
+typedef  unsigned char uint8_t;
+typedef __int16 int16_t;
+typedef long ssize_t;
+#else
+#include <stdint.h> /*provided by mingw32*/
+#include <io.h>
+#define BCTBX_PUBLIC
+#define BCTBX_VAR_PUBLIC extern
+BCTBX_PUBLIC char* strtok_r(char *str, const char *delim, char **nextp);
+#endif
+
+#define vsnprintf	_vsnprintf
+
+typedef SOCKET bctbx_socket_t;
+#ifdef BCTBX_WINDOWS_DESKTOP
+typedef HANDLE bctbx_cond_t;
+typedef HANDLE bctbx_mutex_t;
+#else
+typedef CONDITION_VARIABLE bctbx_cond_t;
+typedef SRWLOCK bctbx_mutex_t;
+#endif
+typedef HANDLE bctbx_thread_t;
+
+#define bctbx_thread_create     __bctbx_WIN_thread_create
+#define bctbx_thread_join       __bctbx_WIN_thread_join
+#define bctbx_thread_self       __bctbx_WIN_thread_self
+#define bctbx_thread_exit(arg)
+#define bctbx_mutex_init        __bctbx_WIN_mutex_init
+#define bctbx_mutex_lock        __bctbx_WIN_mutex_lock
+#define bctbx_mutex_unlock      __bctbx_WIN_mutex_unlock
+#define bctbx_mutex_destroy     __bctbx_WIN_mutex_destroy
+#define bctbx_cond_init         __bctbx_WIN_cond_init
+#define bctbx_cond_signal       __bctbx_WIN_cond_signal
+#define bctbx_cond_broadcast    __bctbx_WIN_cond_broadcast
+#define bctbx_cond_wait         __bctbx_WIN_cond_wait
+#define bctbx_cond_destroy      __bctbx_WIN_cond_destroy
+#define bctbx_inet_aton         __bctbx_WIN_inet_aton
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+BCTBX_PUBLIC int __bctbx_WIN_mutex_init(bctbx_mutex_t *m, void *attr_unused);
+BCTBX_PUBLIC int __bctbx_WIN_mutex_lock(bctbx_mutex_t *mutex);
+BCTBX_PUBLIC int __bctbx_WIN_mutex_unlock(bctbx_mutex_t *mutex);
+BCTBX_PUBLIC int __bctbx_WIN_mutex_destroy(bctbx_mutex_t *mutex);
+BCTBX_PUBLIC int __bctbx_WIN_thread_create(bctbx_thread_t *t, void *attr_unused, void *(*func)(void*), void *arg);
+BCTBX_PUBLIC int __bctbx_WIN_thread_join(bctbx_thread_t thread, void **unused);
+BCTBX_PUBLIC unsigned long __bctbx_WIN_thread_self(void);
+BCTBX_PUBLIC int __bctbx_WIN_cond_init(bctbx_cond_t *cond, void *attr_unused);
+BCTBX_PUBLIC int __bctbx_WIN_cond_wait(bctbx_cond_t * cond, bctbx_mutex_t * mutex);
+BCTBX_PUBLIC int __bctbx_WIN_cond_signal(bctbx_cond_t * cond);
+BCTBX_PUBLIC int __bctbx_WIN_cond_broadcast(bctbx_cond_t * cond);
+BCTBX_PUBLIC int __bctbx_WIN_cond_destroy(bctbx_cond_t * cond);
+BCTBX_PUBLIC int __bctbx_WIN_inet_aton (const char * cp, struct in_addr * addr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define SOCKET_OPTION_VALUE	char *
+#define BCTBX_INLINE			__inline
+#define BCTBX_EWOULDBLOCK  WSAEWOULDBLOCK
+#define BCTBX_EINPROGRESS  WSAEINPROGRESS
+#define BCTBX_ENETUNREACH  WSAENETUNREACH
+#define BCTBX_EHOSTUNREACH WSAEHOSTUNREACH
+#define BCTBX_ENOTCONN     WSAENOTCONN
+#define BCTBX_EPROTOTYPE	WSAEPROTOTYPE /* Protocol wrong type for socket */
+
+#if defined(_WIN32_WCE)
+
+#define bctbx_log10f(x)		(float)log10 ((double)x)
+
+#ifdef assert
+	#undef assert
+#endif /*assert*/
+#define assert(exp)	((void)0)
+
+#ifdef errno
+	#undef errno
+#endif /*errno*/
+#define  errno GetLastError()
+#ifdef strerror
+		#undef strerror
+#endif /*strerror*/
+const char * bctbx_strerror(DWORD value);
+#define strerror bctbx_strerror
+
+
+#else /*_WIN32_WCE*/
+
+#define bctbx_log10f(x)	log10f(x)
+
+#endif
+
+BCTBX_PUBLIC const char *__bctbx_getWinSocketError(int error);
+
+#ifndef getSocketErrorCode
+#define getSocketErrorCode()   WSAGetLastError()
+#endif
+#ifndef getSocketError
+#define getSocketError()       __bctbx_getWinSocketError(WSAGetLastError())
+#endif
+
+#ifndef snprintf
+#define snprintf _snprintf
+#endif
+#ifndef strcasecmp
+#define strcasecmp _stricmp
+#endif
+#ifndef strncasecmp
+#define strncasecmp _strnicmp
+#endif
+#ifndef strdup
+#define strdup _strdup
+#endif
+#ifndef unlink
+#define unlink _unlink
+#endif
+
+#ifndef F_OK
+#define F_OK 00 /* Visual Studio does not define F_OK */
+#endif
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+BCTBX_PUBLIC int bctbx_gettimeofday (struct timeval *tv, void* tz);
+#ifdef _WORKAROUND_MINGW32_BUGS
+char * WSAAPI gai_strerror(int errnum);
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#ifndef _BOOL_T_
+#define _BOOL_T_
+typedef unsigned char bool_t;
+#endif /* _BOOL_T_ */
+#undef TRUE
+#undef FALSE
+#define TRUE 1
+#define FALSE 0
+
+#ifndef MIN
+#define MIN(a,b) (((a)>(b)) ? (b) : (a))
+#endif
+#ifndef MAX
+#define MAX(a,b) (((a)>(b)) ? (a) : (b))
+#endif
+
+typedef struct bctoolboxTimeSpec{
+	int64_t tv_sec;
+	int64_t tv_nsec;
+}bctoolboxTimeSpec;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+BCTBX_PUBLIC void* bctbx_malloc(size_t sz);
+BCTBX_PUBLIC void bctbx_free(void *ptr);
+BCTBX_PUBLIC void* bctbx_realloc(void *ptr, size_t sz);
+BCTBX_PUBLIC void* bctbx_malloc0(size_t sz);
+BCTBX_PUBLIC char * bctbx_strdup(const char *tmp);
+
+/*override the allocator with this method, to be called BEFORE bctbx_init()*/
+typedef struct _BctoolboxMemoryFunctions{
+	void *(*malloc_fun)(size_t sz);
+	void *(*realloc_fun)(void *ptr, size_t sz);
+	void (*free_fun)(void *ptr);
+}BctoolboxMemoryFunctions;
+
+void bctbx_set_memory_functions(BctoolboxMemoryFunctions *functions);
+
+#define bctbx_new(type,count)	(type*)bctbx_malloc(sizeof(type)*(count))
+#define bctbx_new0(type,count)	(type*)bctbx_malloc0(sizeof(type)*(count))
+
+BCTBX_PUBLIC int bctbx_socket_set_non_blocking(bctbx_socket_t sock);
+
+BCTBX_PUBLIC char *bctbx_strndup(const char *str,int n);
+BCTBX_PUBLIC char *bctbx_strdup_printf(const char *fmt,...);
+BCTBX_PUBLIC char *bctbx_strdup_vprintf(const char *fmt, va_list ap);
+BCTBX_PUBLIC char *bctbx_strcat_printf(char *dst, const char *fmt,...);
+BCTBX_PUBLIC char *bctbx_strcat_vprintf(char *dst, const char *fmt, va_list ap);
+BCTBX_PUBLIC char *bctbx_concat(const char *str, ...);
+BCTBX_PUBLIC char *bctbx_replace(char *str, char c, char n);
+
+/**
+ * @brief Return the directory part of a file path.
+ *
+ * Find the last delimiting character ('/' or '\') and return a
+ * copy of the substring before. If no delimiter has been found,
+ * then "." string is returned.
+ *
+ * @param[in] path A string containing a file path. The behaviour
+ * is undefined if the string contains a path to a directoy. MUST be non-NULL.
+ * @return An allocated string containing the directory name.
+ *
+ * @warning This funciton isn't equivalent to libgen.h dirname().
+ */
+BCTBX_PUBLIC char *bctbx_dirname(const char *path);
+
+/**
+ * @brief Return the name of a file from its path.
+ *
+ * Find the last delimiting character ('/' or '\') and return a
+ * copy of the substring after. If no delimiter has been found,
+ * then a copy of 'path' is returned.
+ *
+ * @param[in] path A string containing a file path. The behaviour
+ * is undefined if the string contains a path to a directoy. MUST be non-NULL.
+ * @return An allocated string containing the file name.
+ *
+ * @warning This funciton isn't equivalent to libgen.h basename().
+ */
+BCTBX_PUBLIC char *bctbx_basename(const char *path);
+
+/**
+ * Tests if a file with given pathname exists. Return 0 if yes, -1 otherwise.
+**/
+BCTBX_PUBLIC int bctbx_file_exist(const char *pathname);
+
+/**
+ * Tests if a directory with given pathname exists. Return 0 if yes, -1 otherwise.
+**/
+BCTBX_PUBLIC bool_t bctbx_directory_exists(const char *pathname);
+
+/**
+ * @brief return a timeSpec structure(sec and nsec) containing current time(WARNING: there is no guarantees it is UTC ).
+ *        The time returned may refers to UTC or last boot.
+ *        Use this function only to compute a time span between two calls
+ * @param[in/out]	ret	The current time (seconds and nano seconds).
+ */
+BCTBX_PUBLIC void bctbx_get_cur_time(bctoolboxTimeSpec *ret);
+
+/**
+ * @brief return a timeSpec structure(sec and nsec) containing current UTC time.
+ *
+ * @param[in/out]	ret	The current UTC time, (seconds and nano seconds)
+ */
+BCTBX_PUBLIC void bctbx_get_utc_cur_time(bctoolboxTimeSpec *ret);
+
+BCTBX_PUBLIC uint64_t bctbx_get_cur_time_ms(void);
+BCTBX_PUBLIC void bctbx_sleep_ms(int ms);
+BCTBX_PUBLIC void bctbx_sleep_until(const bctoolboxTimeSpec *ts);
+
+/**
+ * @brief Compares two TimeSpec s1 and s2.
+ *
+ * @param[in]	s1	First time spec
+ * @param[in]	s2	Second time spec
+ *
+ * @return a negative value if s1 is earlier than s2, 0 if they are equal, a positive value if s1 is later than s2
+ */
+BCTBX_PUBLIC int bctbx_timespec_compare(const bctoolboxTimeSpec *s1, const bctoolboxTimeSpec *s2);
+/**
+ * @brief Add given amount of seconds to a timeSpec structure
+ *
+ * @param[in/out]	ts	The timeSpec structure used as input, modified in output by increnting it according to second argument
+ * @param[in]		lap	In seconds, number of seconds to modify the given timeSpec, can be negative(which may set the original timeSpec to 0)
+ */
+BCTBX_PUBLIC void bctbx_timespec_add(bctoolboxTimeSpec *ts, const int64_t lap);
+
+/**
+ * @brief Parse a string into a number of seconds
+ *  Accepted suffixes are Y,M,W,d,h,m,s number is expected to be a base 10 integer, no suffix means seconds
+ *  notes:
+ *     - M suffix(month) is consired a 30 days period without any consideration of the current date, Y is always 365 days.
+ *     - You can combine suffixes in any order: 3Y6M is valid, 15d1M6h is valid too.
+ *     - Any unknown suffix is silently ignored and the value preceding it is discarded
+ *     - NULL or empty string('\0') in timeString are valid and return 0.
+ *
+ * @param[in]	timeString		a string formated like {[0-9]+[Y,M,W,d,h,m,s]?}*'\0' (must be null terminated)
+ * @return	described time period in seconds
+ */
+BCTBX_PUBLIC uint32_t bctbx_time_string_to_sec(const char *timeString);
+
+BCTBX_PUBLIC unsigned int bctbx_random(void);
+
+
+BCTBX_PUBLIC ssize_t bctbx_send(bctbx_socket_t socket, const void *buffer, size_t length, int flags);
+BCTBX_PUBLIC ssize_t bctbx_sendto(bctbx_socket_t socket, const void *message, size_t length, int flags, const struct sockaddr *dest_addr,	socklen_t dest_len);
+BCTBX_PUBLIC ssize_t bctbx_recv(bctbx_socket_t socket, void *buffer, size_t length, int flags);
+BCTBX_PUBLIC ssize_t bctbx_recvfrom(bctbx_socket_t socket, void *buffer, size_t length, int flags, struct sockaddr *address, socklen_t *address_len);
+BCTBX_PUBLIC ssize_t bctbx_read(int fd, void *buf, size_t nbytes);
+BCTBX_PUBLIC ssize_t bctbx_write(int fd, const void *buf, size_t nbytes);
+
+/* Portable and bug-less getaddrinfo */
+BCTBX_PUBLIC int bctbx_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res);
+BCTBX_PUBLIC void bctbx_freeaddrinfo(struct addrinfo *res);
+BCTBX_PUBLIC int bctbx_getnameinfo(const struct sockaddr *address, socklen_t address_len, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags);
+BCTBX_PUBLIC int bctbx_addrinfo_to_ip_address(const struct addrinfo *ai, char *ip, size_t ip_size, int *port);
+BCTBX_PUBLIC int bctbx_addrinfo_to_printable_ip_address(const struct addrinfo *ai, char *printable_ip, size_t printable_ip_size);
+BCTBX_PUBLIC int bctbx_sockaddr_to_ip_address(const struct sockaddr *sa, socklen_t salen, char *ip, size_t ip_size, int *port);
+BCTBX_PUBLIC int bctbx_sockaddr_to_printable_ip_address(struct sockaddr *sa, socklen_t salen, char *printable_ip, size_t printable_ip_size);
+
+/** Sort a list of addrinfo with the following rules:
+ -IPV6 including NAT64.
+ -V4 MAPPED IPV6.
+ -V4.
+**/
+BCTBX_PUBLIC struct addrinfo *bctbx_addrinfo_sort(struct addrinfo *ai);
+	
+
+/**
+ * Convert a numeric ip address and port into an addrinfo, whose family will be as specified in the first argument.
+ * If AF_INET6 is requested, the returned addrinfo will always be an IPv6 address, possibly V4MAPPED if the
+ * ip address was a v4 address.
+ * Passing AF_UNSPEC to this function leads to unspecified results.
+**/
+BCTBX_PUBLIC struct addrinfo * bctbx_ip_address_to_addrinfo(int family, int socktype, const char *ipaddress, int port);
+/**
+ * Convert a name or ip address and port into an addrinfo, whose family will be as specified in the first argument.
+ * If AF_INET6 is requested, the returned addrinfo will always be an IPv6 address, possibly a V4MAPPED if the
+ * ip address was a v4 address.
+ * Passing AF_UNSPEC to this function leads to unspecified results.
+**/
+BCTBX_PUBLIC struct addrinfo * bctbx_name_to_addrinfo(int family, int socktype, const char *name, int port);
+
+/**
+ * This function will transform a V4 to V6 mapped address to a pure V4 and write it into result, or will just copy it otherwise.
+ * The memory for v6 and result may be the same, in which case processing is done in place or no copy is done.
+ * The pointer to result must have sufficient storage, typically a struct sockaddr_storage.
+**/
+BCTBX_PUBLIC void bctbx_sockaddr_remove_v4_mapping(const struct sockaddr *v6, struct sockaddr *result, socklen_t *result_len);
+
+/**
+ * This function will transform a V6 NAT64 mapped address to a pure V4 and write it into result, or will just copy it otherwise.
+ * The memory for v6 and result may be the same, in which case processing is done in place or no copy is done.
+ * The pointer to result must have sufficient storage, typically a struct sockaddr_storage.
+**/
+BCTBX_PUBLIC void bctbx_sockaddr_remove_nat64_mapping(const struct sockaddr *v6, struct sockaddr *result, socklen_t *result_len);
+
+/**
+ * This function will transform a V4 to V6 mapped address to a pure V4 and write it into result, or will just copy it otherwise.
+ * The memory for v6 and result may be the same, in which case processing is done in place or no copy is done.
+ * The pointer to result must have sufficient storage, typically a struct sockaddr_storage.
+**/
+BCTBX_PUBLIC void bctbx_sockaddr_ipv6_to_ipv4(const struct sockaddr *v6, struct sockaddr *result, socklen_t *result_len);
+
+/**
+ * This function will transform any V4 address to a V4 mapped address and write it into result.
+ * The pointer to result must have sufficient storage, typically a struct sockaddr_storage.
+**/
+BCTBX_PUBLIC void bctbx_sockaddr_ipv4_to_ipv6(const struct sockaddr *v4, struct sockaddr *result, socklen_t *result_len);
+
+/**
+ * Return TRUE if both families, ports and addresses are equals
+ */
+BCTBX_PUBLIC bool_t bctbx_sockaddr_equals(const struct sockaddr * sa, const struct sockaddr * sb) ;
+
+/**
+ * Get the local IP address that is used to send data to a specific destination.
+ * @param[in] type The address family of the socket to use.
+ * @param[in] dest The destination address.
+ * @param[in] port The destination port.
+ * @param[out] result The local IP address that is used to send data to the destination.
+ * @param[in] result_len The size of the result buffer.
+ * @return 0 on success, a negative value on error.
+**/
+BCTBX_PUBLIC int bctbx_get_local_ip_for(int type, const char *dest, int port, char *result, size_t result_len);
+
+/* portable named pipes  and shared memory*/
+#if !defined(_WIN32_WCE)
+#ifdef _WIN32
+typedef HANDLE bctbx_pipe_t;
+#define BCTBX_PIPE_INVALID INVALID_HANDLE_VALUE
+#else
+typedef int bctbx_pipe_t;
+#define BCTBX_PIPE_INVALID (-1)
+#endif
+
+BCTBX_PUBLIC bctbx_pipe_t bctbx_server_pipe_create(const char *name);
+/*
+ * warning: on win32 bctbx_server_pipe_accept_client() might return INVALID_HANDLE_VALUE without
+ * any specific error, this happens when bctbx_server_pipe_close() is called on another pipe.
+ * This pipe api is not thread-safe.
+*/
+BCTBX_PUBLIC bctbx_pipe_t bctbx_server_pipe_accept_client(bctbx_pipe_t server);
+BCTBX_PUBLIC int bctbx_server_pipe_close(bctbx_pipe_t spipe);
+BCTBX_PUBLIC int bctbx_server_pipe_close_client(bctbx_pipe_t client);
+
+BCTBX_PUBLIC bctbx_pipe_t bctbx_client_pipe_connect(const char *name);
+BCTBX_PUBLIC int bctbx_client_pipe_close(bctbx_pipe_t sock);
+
+BCTBX_PUBLIC int bctbx_pipe_read(bctbx_pipe_t p, uint8_t *buf, int len);
+BCTBX_PUBLIC int bctbx_pipe_write(bctbx_pipe_t p, const uint8_t *buf, int len);
+
+BCTBX_PUBLIC void *bctbx_shm_open(unsigned int keyid, int size, int create);
+BCTBX_PUBLIC void bctbx_shm_close(void *memory);
+
+BCTBX_PUBLIC bool_t bctbx_is_multicast_addr(const struct sockaddr *addr);
+
+
+#endif
+
+/**
+ * @brief	convert an hexa char [0-9a-fA-F] into the corresponding unsigned integer value
+ * Any invalid char will be converted to zero without any warning
+ *
+ * @param[in]	input_char	a char which shall be in range [0-9a-fA-F]
+ *
+ * @return		the unsigned integer value in range [0-15]
+ */
+BCTBX_PUBLIC uint8_t bctbx_char_to_byte(uint8_t input_char);
+
+/**
+ * @brief	convert a byte which value is in range [0-15] into an hexa char [0-9a-fA-F]
+ *
+ * @param[in]	input_byte	an integer which shall be in range [0-15]
+ * @return		the hexa char [0-9a-f] corresponding to the input
+ */
+BCTBX_PUBLIC uint8_t bctbx_byte_to_char(uint8_t input_byte);
+
+
+/**
+ * @brief Convert an hexadecimal string into the corresponding byte buffer
+ *
+ * @param[out]	output_bytes			The output bytes buffer, must have a length of half the input string buffer
+ * @param[in]	input_string			The input string buffer, must be hexadecimal(it is not checked by function, any non hexa char is converted to 0)
+ * @param[in]	input_string_length	The lenght in chars of the string buffer, output is half this length
+ */
+BCTBX_PUBLIC void bctbx_str_to_uint8(uint8_t *output_bytes, const uint8_t *input_string, size_t input_string_length);
+
+/**
+ * @brief Convert a byte buffer into the corresponding hexadecimal string
+ *
+ * @param[out]	output_string		The output string buffer, must have a length of twice the input bytes buffer
+ * @param[in]	input_bytes			The input bytes buffer
+ * @param[in]	input_bytes_length	The lenght in bytes buffer, output is twice this length
+ */
+BCTBX_PUBLIC void bctbx_int8_to_str(uint8_t *output_string, const uint8_t *input_bytes, size_t input_bytes_length);
+
+/**
+ * @brief Convert an unsigned 32 bits integer into the corresponding hexadecimal string(including null termination character)
+ *
+ * @param[out]	output_string		The output string buffer, must have a length of at least 9 bytes(8 nibbles and the '\0')
+ * @param[in]	input_uint32		The input unsigned int
+ */
+BCTBX_PUBLIC void bctbx_uint32_to_str(uint8_t output_string[9], uint32_t input_uint32);
+
+/**
+ * @brief Convert an hexadecimal string of 8 char length into the corresponding 32 bits unsigned integer
+ *
+ * @param[in]	input_string		The input string buffer, must be hexadecimal and at least 8 char long
+ *
+ * Note : there is no check on the length or validity as an hexa string on the input, incorrect byte is silently mapped to 0
+ */
+BCTBX_PUBLIC uint32_t bctbx_str_to_uint32(const uint8_t input_string[9]);
+
+/**
+ * @brief Convert an unsigned 64 bits integer into the corresponding hexadecimal string(including null termination character)
+ *
+ * @param[out]	output_string		The output string buffer, must have a length of at least 17 bytes(16 nibbles and the '\0')
+ * @param[in]	input_uint64		The input unsigned int
+ */
+BCTBX_PUBLIC void bctbx_uint64_to_str(uint8_t output_string[17], uint64_t input_uint64);
+
+/**
+ * @brief Convert an hexadecimal string of 8 char length into the corresponding 64 bits unsigned integer
+ *
+ * @param[in]	input_string		The input string buffer, must be hexadecimal and at leat 16 char long
+ *
+ * Note : there is no check on the length or validity as an hexa string on the input, incorrect byte is silently mapped to 0
+ */
+BCTBX_PUBLIC uint64_t bctbx_str_to_uint64(const uint8_t input_string[17]);
+
+#ifdef __cplusplus
+}
+
+#endif
+
+
+#ifndef IN6_IS_ADDR_MULTICAST
+#define IN6_IS_ADDR_MULTICAST(i)	(((uint8_t *) (i))[0] == 0xff)
+#endif
+
+#if defined(_WIN32) || defined(__QNX__)
+/* Mingw32 does not define AI_V4MAPPED, however it is supported starting from Windows Vista. QNX also does not define AI_V4MAPPED. */
+#	ifndef AI_V4MAPPED
+#	define AI_V4MAPPED 0x00000800
+#	endif
+#	ifndef AI_ALL
+#	define AI_ALL 0x00000100
+#	endif
+#	ifndef IPV6_V6ONLY
+#	define IPV6_V6ONLY 27
+#	endif
+#endif
+
+#endif
+
+#if defined(_WIN32) || defined(__QNX__)
+  #define FORMAT_SIZE_T    "%Iu"
+#elif __APPLE__
+  #define FORMAT_SIZE_T    "%lu"
+#else
+  #define FORMAT_SIZE_T    "%zu"
+#endif
+
+#if defined(__ANDROID__)
+int mblen(const char* s, size_t n);
+int wctomb(char *s, wchar_t wc);
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/regex.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/regex.h"
new file mode 100755
index 0000000..c420b65
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/regex.h"
@@ -0,0 +1,32 @@
+/*
+	bctoolbox
+	Copyright (C) 2016  Belledonne Communications SARL.
+ 
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU Affero General Public License as
+	published by the Free Software Foundation, either version 3 of the
+	License, or (at your option) any later version.
+ 
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU Affero General Public License for more details.
+ 
+	You should have received a copy of the GNU Affero General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BCTBX_REGEX_H
+#define BCTBX_REGEX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+BCTBX_PUBLIC bool_t bctbx_is_matching_regex(const char *entry, const char* regex);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BCTBX_REGEX_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/tester.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/tester.h"
new file mode 100755
index 0000000..4968a35
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/tester.h"
@@ -0,0 +1,183 @@
+/*
+	tester - liblinphone test suite
+	Copyright (C) 2013  Belledonne Communications SARL
+
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BCTOOLBOX_TESTER_H
+#define BCTOOLBOX_TESTER_H
+
+#include <bctoolbox/port.h>
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <math.h>
+
+
+typedef void (*test_function_t)(void);
+/** Function used in all suites - it is invoked before all and each tests and also after each and all tests
+  * @return 0 means success, otherwise it's an error
+**/
+typedef int (*pre_post_function_t)(void);
+// typedef int (*test_suite_function_t)(const char *name);
+
+typedef struct {
+	const char *name;
+	test_function_t func;
+	const char *tags[2];
+} test_t;
+
+#define TEST_NO_TAG(name, func) \
+	{ name, func, { NULL, NULL } }
+#define TEST_ONE_TAG(name, func, tag) \
+	{ name, func, { tag, NULL } }
+#define TEST_TWO_TAGS(name, func, tag1, tag2) \
+	{ name, func, { tag1, tag2 } }
+
+typedef struct {
+	const char *name; /*suite name*/
+	pre_post_function_t before_all; /*function invoked before running the suite. If not returning 0, suite is not launched. */
+	pre_post_function_t after_all; /*function invoked at the end of the suite, even if some tests failed. */
+	test_function_t before_each;   /*function invoked before each test within this suite. */
+	test_function_t after_each;	/*function invoked after each test within this suite, even if it failed. */
+	int nb_tests;				   /* number of tests */
+	test_t *tests;				   /* tests within this suite */
+} test_suite_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define CHECK_ARG(argument, index, argc)                      \
+if(index >= argc) {                                           \
+fprintf(stderr, "Missing argument for \"%s\"\n", argument);   \
+return -1;                                                    \
+}                                                             \
+
+BCTBX_PUBLIC void bc_tester_init(void (*ftester_printf)(int level, const char *fmt, va_list args)
+									, int verbosity_info, int verbosity_error, const char* expected_res);
+BCTBX_PUBLIC void bc_tester_helper(const char *name, const char* additionnal_helper);
+BCTBX_PUBLIC int bc_tester_parse_args(int argc, char** argv, int argid);
+BCTBX_PUBLIC int bc_tester_start(const char* prog_name);
+BCTBX_PUBLIC int bc_tester_register_suites(void);
+
+BCTBX_PUBLIC int bc_tester_register_suite_by_name(const char *suite_name);
+BCTBX_PUBLIC void bc_tester_add_suite(test_suite_t *suite);
+BCTBX_PUBLIC void bc_tester_uninit(void);
+BCTBX_PUBLIC void bc_tester_printf(int level, const char *fmt, ...);
+BCTBX_PUBLIC const char * bc_tester_get_resource_dir_prefix(void);
+BCTBX_PUBLIC void bc_tester_set_resource_dir_prefix(const char *name);
+BCTBX_PUBLIC const char * bc_tester_get_writable_dir_prefix(void);
+BCTBX_PUBLIC void bc_tester_set_writable_dir_prefix(const char *name);
+
+BCTBX_PUBLIC void bc_tester_set_silent_func(int (*func)(const char*));
+BCTBX_PUBLIC void bc_tester_set_verbose_func(int (*func)(const char*));
+BCTBX_PUBLIC void bc_tester_set_logfile_func(int (*func)(const char*));
+
+BCTBX_PUBLIC int bc_tester_nb_suites(void);
+BCTBX_PUBLIC int bc_tester_nb_tests(const char* name);
+BCTBX_PUBLIC void bc_tester_list_suites(void);
+BCTBX_PUBLIC void bc_tester_list_tests(const char *suite_name);
+BCTBX_PUBLIC const char * bc_tester_suite_name(int suite_index);
+BCTBX_PUBLIC const char * bc_tester_test_name(const char *suite_name, int test_index);
+BCTBX_PUBLIC int bc_tester_run_suite(test_suite_t *suite, const char *tag_name);
+BCTBX_PUBLIC int bc_tester_run_tests(const char *suite_name, const char *test_name, const char *tag_name);
+BCTBX_PUBLIC int bc_tester_suite_index(const char *suite_name);
+BCTBX_PUBLIC const char * bc_tester_current_suite_name(void);
+BCTBX_PUBLIC const char * bc_tester_current_test_name(void);
+BCTBX_PUBLIC const char ** bc_tester_current_test_tags(void);
+
+
+BCTBX_PUBLIC char* bc_sprintfva(const char* format, va_list args);
+BCTBX_PUBLIC char* bc_sprintf(const char* format, ...);
+BCTBX_PUBLIC void bc_free(void *ptr);
+
+BCTBX_PUBLIC char * bc_tester_get_failed_asserts(void);
+BCTBX_PUBLIC unsigned int bc_get_number_of_failures(void);
+BCTBX_PUBLIC void bc_set_trace_handler(void(*handler)(int, const char*, va_list));
+
+/**
+ * Get full path to the given resource
+ *
+ * @param name relative resource path
+ * @return path to the resource. Must be freed by caller.
+*/
+BCTBX_PUBLIC char * bc_tester_res(const char *name);
+
+/**
+* Get full path to the given writable_file
+*
+* @param name relative writable file path
+* @return path to the writable file. Must be freed by caller.
+*/
+BCTBX_PUBLIC char * bc_tester_file(const char *name);
+
+
+/*Redefine the CU_... macros WITHOUT final ';' semicolon, to allow IF conditions and smarter error message */
+extern int CU_assertImplementation(int bValue,
+                                      unsigned int uiLine,
+                                      const char *strCondition,
+                                      const char *strFile,
+                                      const char *strFunction,
+                                      int bFatal);
+
+
+/**
+* Test unit assertion
+*
+* @return 1 if assert was true, 0 otherwise
+*/
+BCTBX_PUBLIC int bc_assert(const char* file, int line, int predicate, const char* format);
+
+#define _BC_ASSERT_PRED(name, pred, actual, expected, type, ...) \
+	do { \
+		char format[4096] = {0}; \
+		type cactual = (actual); \
+		type cexpected = (expected); \
+		snprintf(format, 4096, name "(" #actual ", " #expected ") - " __VA_ARGS__); \
+		bc_assert(__FILE__, __LINE__, pred, format); \
+	} while (0)
+
+#define BC_PASS(msg) bc_assert(__FILE__, __LINE__, TRUE, "BC_PASS(" #msg ").")
+#define BC_FAIL(msg) bc_assert(__FILE__, __LINE__, FALSE, "BC_FAIL(" #msg ").")
+#define BC_ASSERT(value) bc_assert(__FILE__, __LINE__, (value), #value)
+#define BC_TEST(value) bc_assert(__FILE__, __LINE__, (value), #value)
+#define BC_ASSERT_TRUE(value) bc_assert(__FILE__, __LINE__, (value), "BC_ASSERT_TRUE(" #value ")")
+#define BC_ASSERT_FALSE(value) bc_assert(__FILE__, __LINE__, !(value), "BC_ASSERT_FALSE(" #value ")")
+#define BC_ASSERT_PTR_EQUAL(actual, expected) bc_assert(__FILE__, __LINE__, ((actual) == (expected)), "BC_ASSERT_PTR_EQUAL(" #actual "!=" #expected ")")
+#define BC_ASSERT_PTR_NOT_EQUAL(actual, expected) bc_assert(__FILE__, __LINE__, ((actual) != (expected)), "BC_ASSERT_PTR_NOT_EQUAL(" #actual "==" #expected ")")
+#define BC_ASSERT_PTR_NULL(value) bc_assert(__FILE__, __LINE__, ((value) == NULL), "BC_ASSERT_PTR_NULL(" #value ")")
+#define BC_ASSERT_PTR_NOT_NULL(value) bc_assert(__FILE__, __LINE__, ((value) != NULL), "BC_ASSERT_PTR_NOT_NULL(" #value ")")
+
+#define BC_ASSERT_STRING_NOT_EQUAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_STRING_NOT_EQUAL", (strcmp((const char*)(cactual), (const char*)(cexpected))), actual, expected, const char*, "Expected NOT %s but it was.", cexpected)
+#define BC_ASSERT_NSTRING_EQUAL(actual, expected, count) _BC_ASSERT_PRED("BC_ASSERT_NSTRING_EQUAL", !(strncmp((const char*)(cactual), (const char*)(cexpected), (size_t)(count))), actual, expected, const char*, "Expected %*s but was %*s.", (int)(count), cexpected, (int)(count), cactual)
+#define BC_ASSERT_NSTRING_NOT_EQUAL(actual, expected, count) _BC_ASSERT_PRED("BC_ASSERT_NSTRING_NOT_EQUAL", (strncmp((const char*)(cactual), (const char*)(cexpected), (size_t)(count))), actual, expected, const char*, "Expected %*s but it was.", (int)count, cexpected)
+#define BC_ASSERT_DOUBLE_EQUAL(actual, expected, granularity) _BC_ASSERT_PRED("BC_ASSERT_DOUBLE_EQUAL", ((fabs((double)(cactual) - (cexpected)) <= fabs((double)(granularity)))), actual, expected, double, "Expected %f but was %f.", cexpected, cactual)
+#define BC_ASSERT_DOUBLE_NOT_EQUAL(actual, expected, granularity) _BC_ASSERT_PRED("BC_ASSERT_DOUBLE_NOT_EQUAL", ((fabs((double)(cactual) - (cexpected)) > fabs((double)(granularity)))), actual, expected, double, "Expected %f but was %f.", cexpected, cactual)
+
+#define BC_ASSERT_EQUAL(actual, expected, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_EQUAL", ((cactual) == (cexpected)), actual, expected, type, "Expected " type_format " but was " type_format ".", cexpected, cactual)
+#define BC_ASSERT_NOT_EQUAL(actual, expected, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_NOT_EQUAL", ((cactual) != (cexpected)), actual, expected, type, "Expected NOT " type_format " but it was.", cexpected)
+#define BC_ASSERT_STRING_EQUAL(actual, expected) _BC_ASSERT_PRED("BC_ASSERT_STRING_EQUAL", cactual && cexpected && !(strcmp((const char*)(cactual), (const char*)(cexpected))), actual, expected, const char*, "Expected %s but was %s.", cexpected, cactual)
+#define BC_ASSERT_GREATER(actual, min, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_GREATER", ((cactual) >= (cexpected)), actual, min, type, "Expected at least " type_format " but was " type_format ".", cexpected, cactual)
+#define BC_ASSERT_LOWER(actual, max, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_LOWER", ((cactual) <= (cexpected)), actual, max, type, "Expected at most " type_format " but was " type_format ".", cexpected, cactual)
+#define BC_ASSERT_GREATER_STRICT(actual, min, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_GREATER", ((cactual) > (cexpected)), actual, min, type, "Expected more than " type_format " but was " type_format ".", cexpected, cactual)
+#define BC_ASSERT_LOWER_STRICT(actual, max, type, type_format) _BC_ASSERT_PRED("BC_ASSERT_LOWER", ((cactual) < (cexpected)), actual, max, type, "Expected less than " type_format " but was " type_format ".", cexpected, cactual)
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/vconnect.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/vconnect.h"
new file mode 100755
index 0000000..ddba272
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/vconnect.h"
@@ -0,0 +1,219 @@
+/*
+vconnect.h
+Copyright (C) 2017 Belledonne Communications SARL
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
+
+#ifndef BCTBX_VCONNECT
+#define BCTBX_VCONNECT
+
+#include <fcntl.h>
+
+#include <bctoolbox/port.h>
+
+
+#if !defined(_WIN32_WCE)
+#include <sys/types.h>
+#include <sys/stat.h>
+#if _MSC_VER
+#include <io.h>
+#endif
+#endif /*_WIN32_WCE*/
+
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+
+#define BCTBX_VCONNECT_OK         0   /* Successful result */
+
+#define BCTBX_VCONNECT_ERROR       -255   /* Some kind of socket error occurred */
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/**
+ * Methods associated with the bctbx_vsocket_api_t.
+ */
+typedef struct bctbx_vsocket_methods_t bctbx_vsocket_methods_t;
+
+/**
+ * Methods pointer prototypes for the socket functions.
+ */
+struct bctbx_vsocket_methods_t {
+
+	bctbx_socket_t (*pFuncSocket)(int socket_family, int socket_type, int protocol);
+	int (*pFuncConnect)(bctbx_socket_t sock, const struct sockaddr *address, socklen_t address_len);
+	int (*pFuncBind)(bctbx_socket_t sock, const struct sockaddr *address, socklen_t address_len);
+
+	int (*pFuncGetSockName)(bctbx_socket_t sockfd, struct sockaddr *addr, socklen_t *addrlen);
+	int (*pFuncGetSockOpt)(bctbx_socket_t sockfd, int level, int optname, 
+							void *optval, socklen_t *optlen);
+	int (*pFuncSetSockOpt)(bctbx_socket_t sockfd, int level, int optname, 
+							const void *optval, socklen_t optlen);
+	int (*pFuncClose)(bctbx_socket_t sock);
+	char* (*pFuncGetError)(int err);
+	int (*pFuncShutdown)(bctbx_socket_t sock, int how);
+
+
+
+};
+
+
+/**
+ * Socket API structure definition
+ */
+typedef struct bctbx_vsocket_api_t bctbx_vsocket_api_t;
+struct bctbx_vsocket_api_t {
+	const char *vSockName;      					 /* Socket API name */
+	const bctbx_vsocket_methods_t *pSocketMethods;   /* Pointer to the socket methods structure */
+};
+
+
+
+/**===================================================
+ * Socket API methods prototypes.
+ * The default implementation relies on libc methods.
+ *====================================================*/
+
+
+/**
+ * Creates a socket.
+ * @param  socket_family type of address structure
+ * @param  socket_type   socket type i.e SOCK_STREAM
+ * @param  protocol      protocol family i.e AF_INET
+ * @return 				 Returns a socket file descriptor.          
+ */
+BCTBX_PUBLIC bctbx_socket_t bctbx_socket(int socket_family, int socket_type, int protocol);
+
+/**
+ * Get the local socket address.
+ * Calls the function pointer pFuncGetSockName. The default method associated with this pointer 
+ * is getsockname. 
+ * @param  sockfd  socket descriptor 
+ * @param  addr    buffer holding  the current address to which the socket sockfd is bound
+ * @param  addrlen amount of space (in bytes) pointed to by addr
+ * @return         On success, zero is returned.  On error, -1 is returned, and errno is
+ *                 set appropriately.
+ */
+BCTBX_PUBLIC int bctbx_getsockname(bctbx_socket_t sockfd, struct sockaddr *addr, socklen_t *addrlen);
+/**
+ * Get socket options. 
+ * @param  sockfd  socket file descriptor
+ * @param  level   level of the socket option
+ * @param  optname name of the option
+ * @param  optval  buffer in which the value for the requested option(s) are to be returned
+ * @param  optlen  contains the size of the buffer pointed to by optval, and on return 
+ *                 contains the actual size of the value returned. 
+ * @return         On success, zero is returned.  On error, -1 is returned, and errno is
+ *                 set appropriately.
+ */
+BCTBX_PUBLIC int bctbx_getsockopt(bctbx_socket_t sockfd, int level, int optname, 
+							void *optval, socklen_t *optlen);
+/**
+ * Set socket options.
+ * @param  sockfd  socket file descriptor
+ * @param  level   level of the socket option
+ * @param  optname name of the option
+ * @param  optval  buffer holding the value for the requested option
+ * @param  optlen  contains the size of the buffer pointed to by optval
+ * @return         On success, zero is returned.  On error, -1 is returned, and errno is
+ *                 set appropriately.
+ */
+BCTBX_PUBLIC int bctbx_setsockopt(bctbx_socket_t sockfd, int level, int optname, 
+							const void *optval, socklen_t optlen);
+
+/**
+ * Shut down part of a full duplex connection.
+ * @param  sockfd socket file descriptor
+ * @param  how    specifies what is shut down in the connection.
+ * @return        On success, zero is returned.  On error, -1 is returned, and errno is
+ *                set appropriately.
+ */
+BCTBX_PUBLIC int bctbx_shutdown(bctbx_socket_t sockfd, int how);
+
+/**
+ * Close a socket file descriptor.
+ * @param  sockfd socket file descriptor
+ * @return        0 on success , -1 on error and errno is set.
+ */
+BCTBX_PUBLIC int bctbx_socket_close(bctbx_socket_t sockfd);
+
+/**
+ * Assign a name to a socket. 
+ * @param  sockfd      socket file descriptor to assign the name to.
+ * @param  address     address of the socket
+ * @param  address_len size of the address structure pointed to by address (bytes)
+ * @return             On success, zero is returned.  On error, -1 is returned, and errno is
+ *                     set appropriately.
+ */
+BCTBX_PUBLIC int bctbx_bind(bctbx_socket_t sockfd, const struct sockaddr *address, socklen_t address_len);
+
+/**
+ * Initialize a connection to a socket.
+ * @param  sockfd      socket file descriptor
+ * @param  address     address of the socket
+ * @param  address_len size of the address structure pointed to by address (bytes)
+ * @return             On success, zero is returned.  On error, -1 is returned, and errno is
+ *                     set appropriately.
+ */
+BCTBX_PUBLIC int bctbx_connect(bctbx_socket_t sockfd, const struct sockaddr *address, socklen_t address_len);
+
+/**
+ * strerror equivalent.
+ * When an error is returned on a socket operations, returns
+ * the error description based on err (errno) value.
+ * @param  err should be set to errno
+ * @return     Error description
+ */
+BCTBX_PUBLIC char* bctbx_socket_error(int err);
+
+
+/**
+ * Set default bctbx_vsocket_api_t pointer pDefaultvSocket to my_vsocket_api
+ * if it is not NULL, sets it to the standard API implementation otherwise.
+ * By default, the global pointer is set to use bcvSocket implemented in vconnect.c 
+ * @param my_vsocket_api Pointer to a bctbx_vsocket_api_t structure. 
+ */
+BCTBX_PUBLIC void bctbx_vsocket_api_set_default(bctbx_vsocket_api_t *my_vsocket_api);
+
+
+/**
+ * Returns the value of the global variable pDefaultvSocket,
+ * pointing to the default bctbx_vsocket_api_t used.
+ * @return Pointer to bctbx_vsocket_api_t set to operate as default.
+ */
+BCTBX_PUBLIC bctbx_vsocket_api_t* bctbx_vsocket_api_get_default(void);
+	
+/**
+ * Return pointer to standard bctbx_vsocket_api_t implementation based on libc
+ * functions.
+ * @return  pointer to bcSocketAPI
+ */
+BCTBX_PUBLIC bctbx_vsocket_api_t* bctbx_vsocket_api_get_standard(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* BCTBX_VCONNECT */
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/vfs.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/vfs.h"
new file mode 100755
index 0000000..f233083
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Headers/vfs.h"
@@ -0,0 +1,235 @@
+/*
+vfs.h
+Copyright (C) 2016 Belledonne Communications SARL
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
+
+#ifndef BCTBX_VFS_H
+#define BCTBX_VFS_H
+
+#include <fcntl.h>
+
+#include <bctoolbox/port.h>
+
+
+#if !defined(_WIN32_WCE)
+#include <sys/types.h>
+#include <sys/stat.h>
+#if _MSC_VER
+#include <io.h>
+#endif
+#endif /*_WIN32_WCE*/
+
+
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+#ifdef _WIN32
+
+#ifndef S_IRUSR
+#define S_IRUSR S_IREAD
+#endif
+
+#ifndef S_IWUSR
+#define S_IWUSR S_IWRITE
+#endif
+
+#endif /*!_WIN32*/
+
+#define BCTBX_VFS_OK           0   /* Successful result */
+
+#define BCTBX_VFS_ERROR       -255   /* Some kind of disk I/O error occurred */
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/**
+ * Methods associated with the bctbx_vfs_t.
+ */
+typedef struct bctbx_io_methods_t bctbx_io_methods_t;
+
+/**
+ * VFS file handle.
+ */
+typedef struct bctbx_vfs_file_t bctbx_vfs_file_t;
+struct bctbx_vfs_file_t {
+	const struct bctbx_io_methods_t *pMethods;  /* Methods for an open file: all Developpers must supply this field at open step*/
+	/*the fields below are used by the default implementation. Developpers are not required to supply them, but may use them if they find
+	 * them useful*/
+	void* pUserData; 				/*Developpers can store private data under this pointer */
+	int fd;                         /* File descriptor */
+	off_t offset;					/*File offset used by lseek*/
+};
+
+
+/**
+ */
+struct bctbx_io_methods_t {
+	int (*pFuncClose)(bctbx_vfs_file_t *pFile);
+	ssize_t (*pFuncRead)(bctbx_vfs_file_t *pFile, void* buf, size_t count, off_t offset);
+	ssize_t (*pFuncWrite)(bctbx_vfs_file_t *pFile, const void* buf, size_t count, off_t offset);
+	int (*pFuncTruncate)(bctbx_vfs_file_t *pFile, int64_t size);
+	int64_t (*pFuncFileSize)(bctbx_vfs_file_t *pFile);
+	int (*pFuncGetLineFromFd)(bctbx_vfs_file_t *pFile, char* s, int count);
+	off_t (*pFuncSeek)(bctbx_vfs_file_t *pFile, off_t offset, int whence);
+};
+
+
+/**
+ * VFS definition
+ */
+typedef struct bctbx_vfs_t bctbx_vfs_t;
+struct bctbx_vfs_t {
+	const char *vfsName;       /* Virtual file system name */
+	int (*pFuncOpen)(bctbx_vfs_t *pVfs, bctbx_vfs_file_t *pFile, const char *fName, int openFlags);
+};
+
+
+/* API to use the VFS */
+/*
+ * This function returns a pointer to the VFS implemented in this file.
+ */
+BCTBX_PUBLIC bctbx_vfs_t *bc_create_vfs(void);
+
+
+/**
+ * Attempts to read count bytes from the open file given by pFile, at the position starting at offset
+ * in the file and and puts them in the buffer pointed by buf.
+ * @param  pFile  bctbx_vfs_file_t File handle pointer.
+ * @param  buf    Buffer holding the read bytes.
+ * @param  count  Number of bytes to read.
+ * @param  offset Where to start reading in the file (in bytes).
+ * @return        Number of bytes read on success, BCTBX_VFS_ERROR otherwise.
+ */
+BCTBX_PUBLIC ssize_t bctbx_file_read(bctbx_vfs_file_t *pFile, void *buf, size_t count, off_t offset);
+
+/**
+ * Close the file from its descriptor pointed by thw bctbx_vfs_file_t handle.
+ * @param  pFile File handle pointer.
+ * @return      	return value from the pFuncClose VFS Close function on success,
+ *                  BCTBX_VFS_ERROR otherwise.
+ */
+BCTBX_PUBLIC int bctbx_file_close(bctbx_vfs_file_t *pFile);
+
+/**
+ * Allocates a bctbx_vfs_file_t file handle pointer. Opens the file fName
+ * with the mode specified by the mode argument. Calls bctbx_file_open.
+ * @param  pVfs  Pointer to the vfs instance in use.
+ * @param  fName Absolute file path.
+ * @param  mode  File access mode (char*).
+ * @return  pointer to  bctbx_vfs_file_t on success, NULL otherwise.
+ */
+BCTBX_PUBLIC bctbx_vfs_file_t* bctbx_file_open(bctbx_vfs_t *pVfs, const char *fName, const char *mode);
+
+
+/**
+ * Allocates a bctbx_vfs_file_t file handle pointer. Opens the file fName
+ * with the mode specified by the mode argument. Calls bctbx_file_open.
+ * @param  pVfs  		Pointer to the vfs instance in use.
+ * @param  fName 		Absolute file path.
+ * @param  openFlags  	File access flags(integer).
+ * @return  pointer to  bctbx_vfs_file_t on success, NULL otherwise.
+ */
+BCTBX_PUBLIC bctbx_vfs_file_t* bctbx_file_open2(bctbx_vfs_t *pVfs, const char *fName, const int openFlags);
+
+
+/**
+ * Returns the file size.
+ * @param  pFile  bctbx_vfs_file_t File handle pointer.
+ * @return       BCTBX_VFS_ERROR if an error occured, file size otherwise.
+ */
+BCTBX_PUBLIC int64_t bctbx_file_size(bctbx_vfs_file_t *pFile);
+
+/**
+ * Truncates/ Extends a file.
+ * @param  pFile bctbx_vfs_file_t File handle pointer.
+ * @param  size  New size of the file.
+ * @return       BCTBX_VFS_ERROR if an error occured, 0 otherwise.
+ */
+BCTBX_PUBLIC int bctbx_file_truncate(bctbx_vfs_file_t *pFile, int64_t size);
+
+/**
+ * Write count bytes contained in buf to a file associated with pFile at the position
+ * offset. Calls pFuncWrite (set to bc_Write by default).
+ * @param  pFile 	File handle pointer.
+ * @param  buf    	Buffer hodling the values to write.
+ * @param  count  	Number of bytes to write to the file.
+ * @param  offset 	Position in the file where to start writing.
+ * @return        	Number of bytes written on success, BCTBX_VFS_ERROR if an error occurred.
+ */
+BCTBX_PUBLIC ssize_t bctbx_file_write(bctbx_vfs_file_t *pFile, const void *buf, size_t count, off_t offset);
+
+/**
+ * Writes to file.
+ * @param  pFile  File handle pointer.
+ * @param  offset where to write in the file
+ * @param  fmt    format argument, similar to that of printf
+ * @return        Number of bytes written if success, BCTBX_VFS_ERROR otherwise.
+ */
+BCTBX_PUBLIC ssize_t bctbx_file_fprintf(bctbx_vfs_file_t *pFile, off_t offset, const char *fmt, ...);
+
+/**
+ * Wrapper to pFuncGetNxtLine. Returns a line with at most maxlen characters
+ * from the file associated to pFile and  writes it into s.
+ * @param  pFile  File handle pointer.
+ * @param  s      Buffer where to store the read line.
+ * @param  maxlen Number of characters to read to find a line in the file.
+ * @return        BCTBX_VFS_ERROR if an error occurred, size of line read otherwise.
+ */
+BCTBX_PUBLIC int bctbx_file_get_nxtline(bctbx_vfs_file_t *pFile, char *s, int maxlen);
+
+/**
+ * Wrapper to pFuncSeek VFS method call. Set the position to offset in the file.
+ * @param  pFile  File handle pointer.
+ * @param  offset File offset where to set the position to.
+ * @param  whence Either SEEK_SET, SEEK_CUR,SEEK_END
+ * @return        BCTBX_VFS_ERROR on error, offset otherwise.
+ */
+BCTBX_PUBLIC off_t bctbx_file_seek(bctbx_vfs_file_t *pFile, off_t offset, int whence);
+
+
+/**
+ * Set default VFS pointer pDefault to my_vfs.
+ * By default, the global pointer is set to use VFS implemnted in vfs.c
+ * @param my_vfs Pointer to a bctbx_vfs_t structure.
+ */
+BCTBX_PUBLIC void bctbx_vfs_set_default(bctbx_vfs_t *my_vfs);
+
+
+/**
+ * Returns the value of the global variable pDefault,
+ * pointing to the default vfs used.
+ * @return Pointer to bctbx_vfs_t set to operate as default VFS.
+ */
+BCTBX_PUBLIC bctbx_vfs_t* bctbx_vfs_get_default(void);
+
+/**
+ * Return pointer to standard VFS impletentation.
+ * @return  pointer to bcVfs
+ */
+BCTBX_PUBLIC bctbx_vfs_t* bctbx_vfs_get_standard(void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* BCTBX_VFS_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Info.plist"
new file mode 100755
index 0000000..08d5a07
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/bctoolbox" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/bctoolbox"
new file mode 100755
index 0000000..3860e93
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/bctoolbox.framework/bctoolbox"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/Info.plist"
new file mode 100755
index 0000000..6bdd1a0
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/belcard" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/belcard"
new file mode 100755
index 0000000..1a6eb5e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/belcard"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/vcard_grammar" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/vcard_grammar"
new file mode 100755
index 0000000..48ceb8e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belcard.framework/vcard_grammar"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/auth-helper.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/auth-helper.h"
new file mode 100755
index 0000000..da5920a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/auth-helper.h"
@@ -0,0 +1,369 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef AUTHENTICATION_HELPER_H_
+#define AUTHENTICATION_HELPER_H_
+
+#include "belle-sip/defs.h"
+#include "belle-sip/belle-sip.h"
+#include "bctoolbox/crypto.h"
+
+#define MAX_LENGTH_BYTE 32
+#define MAX_RESPONSE_SIZE 65
+
+BELLE_SIP_BEGIN_DECLS
+
+/**
+ * Create an authorization header from an www_authenticate header, all common parameters are copyed.
+ * copy params: scheme, realm, nonce, algorithm, opaque
+ * @param authentication source to be used as input
+ * @return belle_sip_header_authorization_t*
+ */
+BELLESIP_EXPORT belle_sip_header_authorization_t* belle_sip_auth_helper_create_authorization(const belle_sip_header_www_authenticate_t* authentication);
+
+/**
+ * Create an www_authenticate header from an authorization header, all common parameters are copyed.
+ * copy params: scheme, realm, nonce, algorithm, opaque
+ * @param authorization source to be used as input
+ * @return belle_sip_header_www_authenticate_t*
+ */
+BELLESIP_EXPORT belle_sip_header_www_authenticate_t* belle_sip_auth_helper_create_www_authenticate(const belle_sip_header_authorization_t* authorization);
+/**
+ * Create an http authorization header from an www_authenticate header, all common parameters are copyed.
+ * copy params: scheme, realm, nonce, algorithm, opaque
+ * @param authentication source to be used as input
+ * @return belle_http_header_authorization_t*
+ */
+BELLESIP_EXPORT belle_http_header_authorization_t* belle_http_auth_helper_create_authorization(const belle_sip_header_www_authenticate_t* authentication);
+
+
+/**
+ * Create an proxy_authorization header from an www_authenticate header, all common parameters are copyed.
+ * copy params: scheme, realm, nonce, algorithm, opaque
+ * @param authentication source to be used as input
+ * @return belle_sip_header_authorization_t*
+ */
+BELLESIP_EXPORT belle_sip_header_proxy_authorization_t* belle_sip_auth_helper_create_proxy_authorization(const belle_sip_header_proxy_authenticate_t* proxy_authentication);
+
+/**
+ * return size which depends on algorithm
+ * @return 0 if failed
+ */
+BELLESIP_EXPORT int belle_sip_auth_define_size(const char* algo);
+
+/**
+ * compute and set response value according to parameters
+ * HA1=MD5(username:realm:passwd)
+ * fills cnonce if needed (qop=auth);
+ * fills qop
+ *
+ * @return 0 if succeed
+ */
+BELLESIP_EXPORT int belle_sip_auth_helper_fill_authorization(belle_sip_header_authorization_t* authorization
+												,const char* method
+												,const char* ha1);
+
+/**
+ * compute and set response value according to parameters
+ * @return 0 if succeed
+ */
+BELLESIP_EXPORT int belle_sip_auth_helper_fill_proxy_authorization(belle_sip_header_proxy_authorization_t* proxy_authorization
+												,const char* method
+												,const char* ha1);
+
+/*
+ * compute HA1 (NULL terminated)
+ * HA1=MD5(userid:realm:passwd)
+ * return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_auth_helper_compute_ha1(const char* userid,const char* realm,const char* password, char ha1[33]);
+/*
+ * compute HA1 (NULL terminated)
+ * HA1=MD5(userid:realm:passwd) or SHA-256(userid:realm:passwd)
+ * return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_auth_helper_compute_ha1_for_algorithm(const char* userid,const char* realm,const char* password, char *ha1, size_t size, const char* algo);
+/*
+ * compute HA2 (NULL terminated)
+ * HA2=MD5(method:uri)
+ * return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_auth_helper_compute_ha2(const char* method,const char* uri, char ha2[33]);
+
+/*
+ * compute HA2 (NULL terminated)
+ * HA2=MD5(method:uri) or SHA-256(method:uri)
+ * return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_auth_helper_compute_ha2_for_algorithm(const char* method,const char* uri, char *ha2, size_t size, const char* algo);
+/*
+ * compute response(NULL terminated)
+ * res=MD5(ha1:nonce:ha2)
+ * return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_auth_helper_compute_response(const char* ha1,const char* nonce, const char* ha2, char response[33]);
+
+/*
+ * compute response(NULL terminated)
+ * res=MD5(ha1:nonce:ha2) or SHA-256(ha1:nonce:ha2)
+ * return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_auth_helper_compute_response_for_algorithm(const char* ha1,const char* nonce, const char* ha2, char *response, size_t size, const char* algo);
+/*
+ * compute response(NULL terminated)
+ * res=MD5(HA1:nonce:nonce_count:cnonce:qop:HA2)
+ * return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_auth_helper_compute_response_qop_auth(	const char* ha1
+													, const char* nonce
+													, unsigned int nonce_count
+													, const char* cnonce
+													, const char* qop
+													, const char* ha2
+													, char response[33]);
+
+/*
+ * compute response(NULL terminated)
+ * res=MD5(HA1:nonce:nonce_count:cnonce:qop:HA2) or SHA-256(HA1:nonce:nonce_count:cnonce:qop:HA2)
+ * return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_auth_helper_compute_response_qop_auth_for_algorithm(const char* ha1
+                                                                  , const char* nonce
+                                                                  , unsigned int nonce_count
+                                                                  , const char* cnonce
+                                                                  , const char* qop
+                                                                  , const char* ha2
+                                                                  , char *response
+                                                                  , size_t size, const char* algo);
+/*TLS client certificate auth*/
+
+/**
+ * Set TLS certificate verification callback
+ *
+ * @param callback function pointer for callback, or NULL to unset
+ * @deprecated on 2018/03/31 in favor of belle_tls_crypto_config_set_verify_callback()
+ * Callback signature is:
+ * int (*verify_cb_error_cb_t)(unsigned char* der, int length, int depth, int* flags);
+ * der - raw certificate data, in DER format
+ * length - length of certificate DER data
+ * depth - position of certificate in cert chain, ending at 0 = root or top
+ * flags - verification state for CURRENT certificate only
+ */
+BELLESIP_DEPRECATED BELLESIP_EXPORT int belle_sip_tls_set_verify_error_cb(void *callback);
+
+/**
+ * Format of certificate buffer
+ **/
+typedef enum  belle_sip_certificate_raw_format {
+	BELLE_SIP_CERTIFICATE_RAW_FORMAT_PEM, /** PEM format*/
+	BELLE_SIP_CERTIFICATE_RAW_FORMAT_DER /** ASN.1 raw format*/
+}belle_sip_certificate_raw_format_t;
+
+/**
+ * Parse a buffer containing either a certificate chain order in PEM format or a single DER cert
+ * @param buff raw buffer
+ * @param size buffer size
+ * @param format either PEM or DER
+ * @return  belle_sip_certificates_chain_t or NULL if cannot be decoded
+ */
+BELLESIP_EXPORT belle_sip_certificates_chain_t* belle_sip_certificates_chain_parse(const char* buff, size_t size,belle_sip_certificate_raw_format_t format);
+
+/**
+ * Parse a buffer containing either a private or public rsa key in PEM format
+ * @param buff raw buffer
+ * @param size buffer size
+ * @param passwd password (optionnal)
+ * @return list of belle_sip_signing_key_t or NULL if cannot be decoded
+ */
+BELLESIP_EXPORT belle_sip_signing_key_t* belle_sip_signing_key_parse(const char* buff, size_t size,const char* passwd);
+
+/**
+ * Parse a pather containing either a certificate chain order in PEM format or a single DER cert
+ * @param path file
+ * @param format either PEM or DER
+ * @return  belle_sip_certificates_chain_t or NUL if cannot be decoded
+ */
+BELLESIP_EXPORT belle_sip_certificates_chain_t* belle_sip_certificates_chain_parse_file(const char* path, belle_sip_certificate_raw_format_t format);
+
+/**
+ * Parse a directory for *.pem file containing a certificate and private key in PEM format or a single DER cert with subject CNAME as given
+ *
+ * @param[in]	path			directory to parse
+ * @param[in]	subject			subject CNAME to look for
+ * @param[out]	certificate		result certificate, NULL if not found. Is allocated by this function, caller must do a belle_sip_object_unref on it after use
+ * @param[out]	pkey			result private key, NULL if not found. Is allocated by this function, caller must do a belle_sip_object_unref on it after use
+ * @param[in]	format			either PEM or DER
+ * @return  0 if we found a certificate and key matching given subject common name
+ */
+BELLESIP_EXPORT int belle_sip_get_certificate_and_pkey_in_dir(const char *path, const char *subject, belle_sip_certificates_chain_t **certificate, belle_sip_signing_key_t **pkey, belle_sip_certificate_raw_format_t format);
+
+/**
+ * Generate a self signed certificate and key and save them in a file if a path is given, file will be <subject>.pem
+ *
+ * @param[in]	path		If not NULL a file will be written in the given directory. filename is <subject>.pem
+ * @param[in]	subject		used in the CN= field of issuer and subject name
+ * @param[out]	certificate	the generated certificate. Must be destroyed using belle_sip_certificates_chain_destroy
+ * @param[out]	key			the generated key. Must be destroyed using belle_sip_signing_key_destroy
+ * @return 0 on success
+ */
+BELLESIP_EXPORT int belle_sip_generate_self_signed_certificate(const char* path, const char *subject, belle_sip_certificates_chain_t **certificate, belle_sip_signing_key_t **pkey);
+
+/**
+ * Convert a certificate into a its PEM format string
+ *
+ * @param[in]	cert	The certificate to be converted into PEM format string
+ * @return	the PEM representation of certificate. Buffer is allocated by this function and must be freed by caller
+ */
+BELLESIP_EXPORT char *belle_sip_certificates_chain_get_pem(belle_sip_certificates_chain_t *cert);
+
+/**
+ * Convert a key into a its PEM format string
+ *
+ * @param[in]	key		The key to be converted into PEM format string
+ * @return	the PEM representation of key. Buffer is allocated by this function and must be freed by caller
+ */
+BELLESIP_EXPORT char *belle_sip_signing_key_get_pem(belle_sip_signing_key_t *key);
+
+/**
+ * Generate a certificate fingerprint as described in RFC4572
+ * Note: only SHA1 signing algo is supported for now
+ *
+ * @param[in]	certificate		The certificate used to generate the fingerprint
+ * @return		The generated fingerprint formatted according to RFC4572 section 5. Is a null terminated string, must be freed by caller
+ */
+BELLESIP_EXPORT char *belle_sip_certificates_chain_get_fingerprint(belle_sip_certificates_chain_t *certificate);
+
+/**
+ * Parse a pather containing either a private or public rsa key
+ * @param path file
+ * @param passwd password (optionnal)
+ * @return list of belle_sip_signing_key_t or NUL iff cannot be decoded
+ */
+BELLESIP_EXPORT belle_sip_signing_key_t* belle_sip_signing_key_parse_file(const char* path, const char* passwd);
+
+#define BELLE_TLS_VERIFY_NONE		(0)
+#define BELLE_TLS_VERIFY_CN_MISMATCH (1)
+#define BELLE_TLS_VERIFY_ANY_REASON (0xff)
+/* Set of functions deprecated on 2016/02/02 use the belle_tls_crypto_config_XXX ones */
+BELLESIP_DEPRECATED BELLESIP_EXPORT belle_tls_verify_policy_t *belle_tls_verify_policy_new(void);
+BELLESIP_DEPRECATED BELLESIP_EXPORT int belle_tls_verify_policy_set_root_ca(belle_tls_verify_policy_t *obj, const char *path);
+BELLESIP_DEPRECATED BELLESIP_EXPORT void belle_tls_verify_policy_set_exceptions(belle_tls_verify_policy_t *obj, int flags);
+BELLESIP_DEPRECATED BELLESIP_EXPORT unsigned int belle_tls_verify_policy_get_exceptions(const belle_tls_verify_policy_t *obj);
+
+
+/**
+ * Create a new crypto configuration object
+ * The crypto configuration may be passed to a http provider or a listening point using the appropriate methods
+ * It can be used to provide :
+ * - a path to the trusted root certificates
+ * - a way to override certificate verification exceptions
+ * - a ssl configuration structure provided directly to the underlying crypto library (mbedtls 2 or above),
+ * @return an empty belle_tls_crypto_config object, trusted certificate path is initialised to the default system path without any warranty
+ */
+BELLESIP_EXPORT belle_tls_crypto_config_t *belle_tls_crypto_config_new(void);
+
+/**
+ * Set the path to the trusted certificate chain
+ * @param[in/out]	obj		The crypto configuration object to set
+ * @param[in]		path	The path to the trusted certificate chain file(NULL terminated string)
+ *
+ * @return 0 on success
+ */
+BELLESIP_EXPORT int belle_tls_crypto_config_set_root_ca(belle_tls_crypto_config_t *obj, const char *path);
+
+/**
+ * Set the content of the trusted certificate chain
+ * @param[in/out]	obj		The crypto configuration object to set
+ * @param[in]		data	The content to the trusted certificate chain data(NULL terminated string)
+ *
+ * @return 0 on success
+ */
+BELLESIP_EXPORT int belle_tls_crypto_config_set_root_ca_data(belle_tls_crypto_config_t *obj, const char *data);
+
+/**
+ * Set the exception flags to manage exception overriding during peer certificate verification
+ * @param[in/out]	obj		The crypto configuration object to set
+ * @param[in]		flags	Flags value to set:
+ * 							BELLE_TLS_VERIFY_NONE to raise and error on any exception
+ * 							BELLE_TLS_VERIFY_CN_MISMATCH to ignore Common Name mismatch
+ * 							BELLE_TLS_VERIFY_ANY_REASON to ignore any exception
+ *
+ * @return 0 on success
+ */
+BELLESIP_EXPORT void belle_tls_crypto_config_set_verify_exceptions(belle_tls_crypto_config_t *obj, int flags);
+
+/**
+ * Get the exception flags used to manage exception overriding during peer certificate verification
+ * @param[in]i		obj		The crypto configuration object to set
+ * @return			Possible flags value :
+ * 							BELLE_TLS_VERIFY_NONE to raise and error on any exception
+ * 							BELLE_TLS_VERIFY_CN_MISMATCH to ignore Common Name mismatch
+ * 							BELLE_TLS_VERIFY_ANY_REASON to ignore any exception
+ *
+ */
+BELLESIP_EXPORT unsigned int belle_tls_crypto_config_get_verify_exceptions(const belle_tls_crypto_config_t *obj);
+
+
+/**
+ * Callback prototype to override certificate check at upper level.
+ * @param user_data the user pointer passed to belle_tls_crypto_config_set_verify_callback()
+ * @param cert the x509 certificate
+ * @param depth depth of certificate in the certificate chain (the callback is called for each certificate of the chain
+ * @param flags i/o parameter containing the error flags reported by the crypto library (BCTBX_CERTIFICATE_VERIFY_* flags).
+ * 		The application may freely alterate the flags on output, in order to bypass verifications or add new error flags.
+ * 		The flags MUST be set or unset with bctbx_x509_certificate_set_flag() bctbx_x509_certificate_unset_flag()
+**/
+typedef void (*belle_tls_crypto_config_verify_callback_t)(void *user_data, bctbx_x509_certificate_t *cert , int depth, uint32_t *flags);
+
+/**
+ * Set a callback function to call during each TLS handshake in order to override certificate verification.
+ * @param obj the crypto config object
+ * @param cb the application callback
+ * @param cb_data an application data pointer that will be passed to callback when invoked.
+**/
+BELLESIP_EXPORT void belle_tls_crypto_config_set_verify_callback(belle_tls_crypto_config_t *obj, belle_tls_crypto_config_verify_callback_t cb, void *cb_data);
+
+
+/**
+ * Callback prototype to check remote certificate once hanshake is completed (post-check).
+ * @param user_data the user pointer passed to belle_tls_crypto_config_set_postcheck_callback()
+ * @param cert the peer x509 certificate
+ * @return 0 if all is good, -1 otherwise
+**/
+typedef int (*belle_tls_crypto_config_postcheck_callback_t)(void *user_data, const bctbx_x509_certificate_t *cert);
+
+/**
+ * Set the post-check callback function executed upon successfull TLS handshake..
+ * @param obj the crypto config object
+ * @param cb the application callback
+ * @param cb_data an application data pointer that will be passed to callback when invoked.
+**/
+BELLESIP_EXPORT void belle_tls_crypto_config_set_postcheck_callback(belle_tls_crypto_config_t *obj, belle_tls_crypto_config_postcheck_callback_t cb, void *cb_data);
+
+/**
+ * Set the pointer to an externally provided ssl configuration for the crypto library
+ * @param[in/out]	obj			The crypto configuration object to set
+ * @param[in]		ssl_config	A pointer to an opaque structure which will be provided directly to the crypto library used in bctoolbox. Use with extra care.
+ * 								This ssl_config structure is responsability of the caller and will not be freed at the connection's end.
+ */
+BELLESIP_EXPORT void belle_tls_crypto_config_set_ssl_config(belle_tls_crypto_config_t *obj, void *ssl_config);
+
+BELLE_SIP_END_DECLS
+
+#endif /* AUTHENTICATION_HELPER_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/belle-sdp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/belle-sdp.h"
new file mode 100755
index 0000000..c5a2f5d
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/belle-sdp.h"
@@ -0,0 +1,413 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SDP_H_
+#define BELLE_SDP_H_
+
+#include "belle-sip/defs.h"
+#include "belle-sip/list.h"
+
+#define BELLE_SDP_CAST(obj,t) BELLE_SIP_CAST(obj,t)
+
+BELLE_SIP_BEGIN_DECLS
+
+/***************************************************************************************
+ * Attribute
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_attribute belle_sdp_attribute_t;
+BELLESIP_EXPORT belle_sdp_attribute_t* belle_sdp_attribute_new(void);
+BELLESIP_EXPORT belle_sdp_attribute_t* belle_sdp_attribute_parse (const char* attribute);
+BELLESIP_EXPORT belle_sdp_attribute_t* belle_sdp_attribute_create (const char* name,const char* value);
+BELLESIP_EXPORT const char* belle_sdp_attribute_get_name(const belle_sdp_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_attribute_set_name(belle_sdp_attribute_t* attribute, const char* name);
+BELLESIP_EXPORT const char* belle_sdp_attribute_get_value(belle_sdp_attribute_t* attribute);
+BELLESIP_EXPORT unsigned int belle_sdp_attribute_has_value(belle_sdp_attribute_t* attribute);
+#define BELLE_SDP_ATTRIBUTE(t) BELLE_SDP_CAST(t,belle_sdp_attribute_t)
+#define belle_sdp_attribute_init(obj)		/*nothing*/
+/***************************************************************************************
+ * RAW Attribute
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_raw_attribute belle_sdp_raw_attribute_t;
+BELLESIP_EXPORT belle_sdp_raw_attribute_t* belle_sdp_raw_attribute_new(void);
+BELLESIP_EXPORT belle_sdp_raw_attribute_t* belle_sdp_raw_attribute_parse(const char* attribute);
+BELLESIP_EXPORT belle_sdp_raw_attribute_t* belle_sdp_raw_attribute_create(const char* name, const char* value);
+BELLESIP_EXPORT void belle_sdp_raw_attribute_set_value(belle_sdp_raw_attribute_t* attribute, const char* value);
+#define BELLE_SDP_RAW_ATTRIBUTE(t) BELLE_SDP_CAST(t,belle_sdp_raw_attribute_t)
+/***************************************************************************************
+ * RTCP-FB Attribute
+ *
+ **************************************************************************************/
+typedef enum _belle_sdp_rtcp_fb_val_type {
+	BELLE_SDP_RTCP_FB_ACK,
+	BELLE_SDP_RTCP_FB_NACK,
+	BELLE_SDP_RTCP_FB_TRR_INT,
+	BELLE_SDP_RTCP_FB_CCM
+} belle_sdp_rtcp_fb_val_type_t;
+typedef enum _belle_sdp_rtcp_fb_val_param {
+	BELLE_SDP_RTCP_FB_NONE,
+	BELLE_SDP_RTCP_FB_PLI,
+	BELLE_SDP_RTCP_FB_SLI,
+	BELLE_SDP_RTCP_FB_RPSI,
+	BELLE_SDP_RTCP_FB_APP,
+	BELLE_SDP_RTCP_FB_FIR,
+	BELLE_SDP_RTCP_FB_TMMBR
+} belle_sdp_rtcp_fb_val_param_t;
+typedef struct _belle_sdp_rtcp_fb_attribute belle_sdp_rtcp_fb_attribute_t;
+BELLESIP_EXPORT belle_sdp_rtcp_fb_attribute_t* belle_sdp_rtcp_fb_attribute_new(void);
+BELLESIP_EXPORT belle_sdp_rtcp_fb_attribute_t* belle_sdp_rtcp_fb_attribute_parse(const char* attribute);
+BELLESIP_EXPORT belle_sdp_rtcp_fb_attribute_t* belle_sdp_rtcp_fb_attribute_create(void);
+BELLESIP_EXPORT int8_t belle_sdp_rtcp_fb_attribute_get_id(const belle_sdp_rtcp_fb_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_fb_attribute_set_id(belle_sdp_rtcp_fb_attribute_t* attribute, int8_t id);
+BELLESIP_EXPORT belle_sdp_rtcp_fb_val_type_t belle_sdp_rtcp_fb_attribute_get_type(const belle_sdp_rtcp_fb_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_fb_attribute_set_type(belle_sdp_rtcp_fb_attribute_t* attribute, belle_sdp_rtcp_fb_val_type_t type);
+BELLESIP_EXPORT belle_sdp_rtcp_fb_val_param_t belle_sdp_rtcp_fb_attribute_get_param(const belle_sdp_rtcp_fb_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_fb_attribute_set_param(belle_sdp_rtcp_fb_attribute_t* attribute, belle_sdp_rtcp_fb_val_param_t param);
+BELLESIP_EXPORT uint16_t belle_sdp_rtcp_fb_attribute_get_trr_int(const belle_sdp_rtcp_fb_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_fb_attribute_set_trr_int(belle_sdp_rtcp_fb_attribute_t* attribute, uint16_t milliseconds);
+BELLESIP_EXPORT uint32_t belle_sdp_rtcp_fb_attribute_get_smaxpr(const belle_sdp_rtcp_fb_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_fb_attribute_set_smaxpr(belle_sdp_rtcp_fb_attribute_t* attribute, uint32_t smaxpr);
+#define BELLE_SDP_RTCP_FB_ATTRIBUTE(t) BELLE_SDP_CAST(t,belle_sdp_rtcp_fb_attribute_t)
+/***************************************************************************************
+ * RTCP-XR Attribute
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_rtcp_xr_attribute belle_sdp_rtcp_xr_attribute_t;
+BELLESIP_EXPORT belle_sdp_rtcp_xr_attribute_t* belle_sdp_rtcp_xr_attribute_new(void);
+BELLESIP_EXPORT belle_sdp_rtcp_xr_attribute_t* belle_sdp_rtcp_xr_attribute_parse(const char* attribute);
+BELLESIP_EXPORT belle_sdp_rtcp_xr_attribute_t* belle_sdp_rtcp_xr_attribute_create(void);
+BELLESIP_EXPORT const char* belle_sdp_rtcp_xr_attribute_get_rcvr_rtt_mode(const belle_sdp_rtcp_xr_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_xr_attribute_set_rcvr_rtt_mode(belle_sdp_rtcp_xr_attribute_t* attribute, const char *mode);
+BELLESIP_EXPORT int belle_sdp_rtcp_xr_attribute_get_rcvr_rtt_max_size(const belle_sdp_rtcp_xr_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_xr_attribute_set_rcvr_rtt_max_size(belle_sdp_rtcp_xr_attribute_t* attribute, int max_size);
+BELLESIP_EXPORT unsigned int belle_sdp_rtcp_xr_attribute_has_stat_summary(const belle_sdp_rtcp_xr_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_xr_attribute_set_stat_summary(belle_sdp_rtcp_xr_attribute_t* attribute, unsigned int enable);
+BELLESIP_EXPORT const belle_sip_list_t* belle_sdp_rtcp_xr_attribute_get_stat_summary_flags(const belle_sdp_rtcp_xr_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_xr_attribute_add_stat_summary_flag(belle_sdp_rtcp_xr_attribute_t* attribute, const char* flag);
+BELLESIP_EXPORT unsigned int belle_sdp_rtcp_xr_attribute_has_voip_metrics(const belle_sdp_rtcp_xr_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_rtcp_xr_attribute_set_voip_metrics(belle_sdp_rtcp_xr_attribute_t* attribute, unsigned int enable);
+#define BELLE_SDP_RTCP_XR_ATTRIBUTE(t) BELLE_SDP_CAST(t,belle_sdp_rtcp_xr_attribute_t)
+/***************************************************************************************
+ * Bandwidth
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_bandwidth belle_sdp_bandwidth_t;
+BELLESIP_EXPORT belle_sdp_bandwidth_t* belle_sdp_bandwidth_new(void);
+BELLESIP_EXPORT belle_sdp_bandwidth_t* belle_sdp_bandwidth_parse (const char* bandwidth);
+BELLESIP_EXPORT int belle_sdp_bandwidth_get_value(const belle_sdp_bandwidth_t* attribute);
+BELLESIP_EXPORT const char* belle_sdp_bandwidth_get_type(const belle_sdp_bandwidth_t* attribute);
+BELLESIP_EXPORT void belle_sdp_bandwidth_set_value(belle_sdp_bandwidth_t* attribute, int value);
+BELLESIP_EXPORT void belle_sdp_bandwidth_set_type(belle_sdp_bandwidth_t* attribute, const char* type);
+#define BELLE_SDP_BANDWIDTH(t) BELLE_SDP_CAST(t,belle_sdp_bandwidth_t)
+/***************************************************************************************
+ * Connection
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_connection belle_sdp_connection_t;
+BELLESIP_EXPORT belle_sdp_connection_t* belle_sdp_connection_new(void);
+BELLESIP_EXPORT belle_sdp_connection_t* belle_sdp_connection_create(const char* net_type, const char* addr_type, const char* addr);
+BELLESIP_EXPORT belle_sdp_connection_t* belle_sdp_connection_parse (const char* connection);
+BELLESIP_EXPORT const char* belle_sdp_connection_get_address(const belle_sdp_connection_t* connection);
+BELLESIP_EXPORT const char* belle_sdp_connection_get_address_type(const belle_sdp_connection_t* connection);
+BELLESIP_EXPORT const char* belle_sdp_connection_get_network_type(const belle_sdp_connection_t* connection);
+BELLESIP_EXPORT int belle_sdp_connection_get_ttl(const belle_sdp_connection_t* connection);
+BELLESIP_EXPORT int belle_sdp_connection_get_range(const belle_sdp_connection_t* connection);
+BELLESIP_EXPORT void belle_sdp_connection_set_address(belle_sdp_connection_t* connection, const char* addr);
+BELLESIP_EXPORT void belle_sdp_connection_set_address_type(belle_sdp_connection_t* connection, const char* type);
+BELLESIP_EXPORT void belle_sdp_connection_set_network_type(belle_sdp_connection_t* connection, const char* type);
+BELLESIP_EXPORT void belle_sdp_connection_set_ttl(belle_sdp_connection_t* connection,int ttl);
+BELLESIP_EXPORT void belle_sdp_connection_set_range(belle_sdp_connection_t* connection,int range);
+#define BELLE_SDP_CONNECTION(t) BELLE_SDP_CAST(t,belle_sdp_connection_t)
+/***************************************************************************************
+ * Email
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_email belle_sdp_email_t;
+BELLESIP_EXPORT belle_sdp_email_t* belle_sdp_email_new(void);
+BELLESIP_EXPORT belle_sdp_email_t* belle_sdp_email_parse (const char* email);
+BELLESIP_EXPORT const char* belle_sdp_email_get_value(const belle_sdp_email_t* email);
+BELLESIP_EXPORT void belle_sdp_email_set_value(belle_sdp_email_t* email, const char* value);
+#define BELLE_SDP_EMAIL(t) BELLE_SDP_CAST(t,belle_sdp_email_t)
+/***************************************************************************************
+ * Info
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_info belle_sdp_info_t;
+BELLESIP_EXPORT belle_sdp_info_t* belle_sdp_info_new(void);
+BELLESIP_EXPORT belle_sdp_info_t* belle_sdp_info_parse (const char* info);
+BELLESIP_EXPORT const char* belle_sdp_info_get_value(const belle_sdp_info_t* info);
+BELLESIP_EXPORT void belle_sdp_info_set_value(belle_sdp_info_t* info, const char* value);
+#define BELLE_SDP_INFO(t) BELLE_SDP_CAST(t,belle_sdp_info_t)
+/***************************************************************************************
+ * Key
+ *
+ **************************************************************************************/
+//typedef struct _belle_sdp_key belle_sdp_key_t;
+//belle_sdp_key_t* belle_sdp_key_new(void);
+//belle_sdp_key_t* belle_sdp_key_parse (const char* key);
+//const char* belle_sdp_key_get_key(const belle_sdp_key_t* key);
+//const char* belle_sdp_key_get_method(const belle_sdp_key_t* key);
+//unsigned int belle_sdp_key_as_key(const belle_sdp_key_t* key);
+//void belle_sdp_key_set_key(belle_sdp_key_t* key, const char* keyvalue);
+//void belle_sdp_key_set_method(belle_sdp_key_t* key, const char* method);
+//#define BELLE_SDP_KEY(t) BELLE_SDP_CAST(t,belle_sdp_key_t);
+/***************************************************************************************
+ * Media
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_media belle_sdp_media_t;
+BELLESIP_EXPORT belle_sdp_media_t* belle_sdp_media_new(void);
+BELLESIP_EXPORT belle_sdp_media_t* belle_sdp_media_parse (const char* media);
+BELLESIP_EXPORT belle_sdp_media_t* belle_sdp_media_create(const char* media_type
+                         ,int media_port
+                         ,int port_count
+                         ,const char* protocol
+                         ,belle_sip_list_t* static_media_formats);
+BELLESIP_EXPORT belle_sip_list_t*	belle_sdp_media_get_media_formats(const belle_sdp_media_t* media);
+BELLESIP_EXPORT const char*	belle_sdp_media_get_raw_fmt(const belle_sdp_media_t* media);
+BELLESIP_EXPORT int	belle_sdp_media_get_media_port(const belle_sdp_media_t* media);
+BELLESIP_EXPORT const char* belle_sdp_media_get_media_type(const belle_sdp_media_t* media);
+BELLESIP_EXPORT int	belle_sdp_media_get_port_count(const belle_sdp_media_t* media);
+BELLESIP_EXPORT const char* belle_sdp_media_get_protocol(const belle_sdp_media_t* media);
+BELLESIP_EXPORT void belle_sdp_media_set_media_formats(belle_sdp_media_t* media, belle_sip_list_t* mediaFormats);
+BELLESIP_EXPORT void belle_sdp_media_set_raw_fmt(belle_sdp_media_t* media, const char* fmt);
+BELLESIP_EXPORT void belle_sdp_media_set_media_port(belle_sdp_media_t* media, int port);
+BELLESIP_EXPORT void belle_sdp_media_set_media_type(belle_sdp_media_t* media, const char* mediaType);
+BELLESIP_EXPORT void belle_sdp_media_set_port_count(belle_sdp_media_t* media, int port_count);
+BELLESIP_EXPORT void belle_sdp_media_set_protocol(belle_sdp_media_t* media, const char* protocole);
+#define BELLE_SDP_MEDIA(t) BELLE_SDP_CAST(t,belle_sdp_media_t)
+
+/***************************************************************************************
+ * mime_parameter
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_mime_parameter belle_sdp_mime_parameter_t;
+BELLESIP_EXPORT belle_sdp_mime_parameter_t* belle_sdp_mime_parameter_new(void);
+BELLESIP_EXPORT belle_sdp_mime_parameter_t* belle_sdp_mime_parameter_create(const char* type, int media_format, int rate,int channel_count);
+BELLESIP_EXPORT int belle_sdp_mime_parameter_get_rate(const belle_sdp_mime_parameter_t* mime_parameter);
+BELLESIP_EXPORT void belle_sdp_mime_parameter_set_rate(belle_sdp_mime_parameter_t* mime_parameter,int rate);
+BELLESIP_EXPORT int belle_sdp_mime_parameter_get_channel_count(const belle_sdp_mime_parameter_t* mime_parameter);
+BELLESIP_EXPORT void belle_sdp_mime_parameter_set_channel_count(belle_sdp_mime_parameter_t* mime_parameter,int count);
+BELLESIP_EXPORT int belle_sdp_mime_parameter_get_ptime(const belle_sdp_mime_parameter_t* mime_parameter);
+BELLESIP_EXPORT void belle_sdp_mime_parameter_set_ptime(belle_sdp_mime_parameter_t* mime_parameter,int ptime);
+BELLESIP_EXPORT int belle_sdp_mime_parameter_get_max_ptime(const belle_sdp_mime_parameter_t* mime_parameter);
+BELLESIP_EXPORT void belle_sdp_mime_parameter_set_max_ptime(belle_sdp_mime_parameter_t* mime_parameter,int max_ptime);
+BELLESIP_EXPORT const char* belle_sdp_mime_parameter_get_type(const belle_sdp_mime_parameter_t* mime_parameter);
+BELLESIP_EXPORT void belle_sdp_mime_parameter_set_type(belle_sdp_mime_parameter_t* mime_parameter,const char* type);
+BELLESIP_EXPORT int belle_sdp_mime_parameter_get_media_format(const belle_sdp_mime_parameter_t* mime_parameter);
+BELLESIP_EXPORT void belle_sdp_mime_parameter_set_media_format(belle_sdp_mime_parameter_t* mime_parameter,int format);
+BELLESIP_EXPORT const char* belle_sdp_mime_parameter_get_parameters(const belle_sdp_mime_parameter_t* mime_parameter);
+BELLESIP_EXPORT void belle_sdp_mime_parameter_set_parameters(belle_sdp_mime_parameter_t* mime_parameter,const char* parameters);
+#define BELLE_SDP_MIME_PARAMETER(t) BELLE_SDP_CAST(t,belle_sdp_mime_parameter_t)
+
+/***************************************************************************************
+ * Media Description
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_media_description belle_sdp_media_description_t;
+BELLESIP_EXPORT belle_sdp_media_description_t* belle_sdp_media_description_new(void);
+BELLESIP_EXPORT belle_sdp_media_description_t* belle_sdp_media_description_parse (const char* media_description);
+BELLESIP_EXPORT belle_sdp_media_description_t* belle_sdp_media_description_create(const char* media_type
+                         	 	 	 	 	 	 	 	 	 	 ,int media_port
+                         	 	 	 	 	 	 	 	 	 	 ,int port_count
+                         	 	 	 	 	 	 	 	 	 	 ,const char* protocol
+                         	 	 	 	 	 	 	 	 	 	 ,belle_sip_list_t* static_media_formats);
+BELLESIP_EXPORT void belle_sdp_media_description_add_dynamic_payloads(belle_sdp_media_description_t* media_description, belle_sip_list_t* payloadNames, belle_sip_list_t* payloadValues);
+BELLESIP_EXPORT const char*	belle_sdp_media_description_get_attribute_value(const belle_sdp_media_description_t* media_description, const char* name);
+BELLESIP_EXPORT belle_sdp_attribute_t*	belle_sdp_media_description_get_attribute(const belle_sdp_media_description_t* media_description, const char* name);
+BELLESIP_EXPORT belle_sip_list_t* belle_sdp_media_description_get_attributes(const belle_sdp_media_description_t* media_description);
+BELLESIP_EXPORT int	belle_sdp_media_description_get_bandwidth(const belle_sdp_media_description_t* media_description, const char* name);
+BELLESIP_EXPORT belle_sip_list_t* belle_sdp_media_description_get_bandwidths(const belle_sdp_media_description_t* media_description);
+BELLESIP_EXPORT belle_sdp_connection_t*	belle_sdp_media_description_get_connection(const belle_sdp_media_description_t* media_description);
+BELLESIP_EXPORT belle_sdp_info_t* belle_sdp_media_description_get_info(const belle_sdp_media_description_t* media_description);
+/*belle_sdp_key_t*  belle_sdp_media_description_get_key(const belle_sdp_media_description_t* media_description);*/
+BELLESIP_EXPORT belle_sdp_media_t* belle_sdp_media_description_get_media(const belle_sdp_media_description_t* media_description);
+BELLESIP_EXPORT belle_sip_list_t* belle_sdp_media_description_build_mime_parameters(const belle_sdp_media_description_t* media_description);
+/*belle_sip_list_t* belle_sdp_media_description_get_mime_types(const belle_sdp_media_description_t* media_description);*/
+BELLESIP_EXPORT void belle_sdp_media_description_remove_attribute(belle_sdp_media_description_t* media_description,const char* attribute);
+BELLESIP_EXPORT void belle_sdp_media_description_remove_bandwidth(belle_sdp_media_description_t* media_description,const char* bandwidth);
+BELLESIP_EXPORT void belle_sdp_media_description_set_attribute_value(belle_sdp_media_description_t* media_description, const char* name, const char* value);
+BELLESIP_EXPORT void belle_sdp_media_description_add_attribute(belle_sdp_media_description_t* media_description, const belle_sdp_attribute_t* attr);
+BELLESIP_EXPORT void belle_sdp_media_description_set_attributes(belle_sdp_media_description_t* media_description, belle_sip_list_t* Attributes);
+BELLESIP_EXPORT void belle_sdp_media_description_set_bandwidth(belle_sdp_media_description_t* media_description, const char* name, int value);
+BELLESIP_EXPORT void belle_sdp_media_description_add_bandwidth(belle_sdp_media_description_t* media_description, const belle_sdp_bandwidth_t* bandwidth);
+BELLESIP_EXPORT void belle_sdp_media_description_set_bandwidths(belle_sdp_media_description_t* media_description, belle_sip_list_t* bandwidths);
+BELLESIP_EXPORT void belle_sdp_media_description_set_connection(belle_sdp_media_description_t* media_description, belle_sdp_connection_t* conn);
+BELLESIP_EXPORT void belle_sdp_media_description_set_info(belle_sdp_media_description_t* media_description,belle_sdp_info_t* i);
+/*void belle_sdp_media_description_set_key(belle_sdp_media_description_t* media_description,belle_sdp_key_t* key);*/
+BELLESIP_EXPORT void belle_sdp_media_description_set_media(belle_sdp_media_description_t* media_description, belle_sdp_media_t* media);
+BELLESIP_EXPORT void belle_sdp_media_description_append_values_from_mime_parameter(belle_sdp_media_description_t* media_description, const belle_sdp_mime_parameter_t* mime_parameter);
+#define BELLE_SDP_MEDIA_DESCRIPTION(t) BELLE_SDP_CAST(t,belle_sdp_media_description_t)
+
+/***************************************************************************************
+ * Origin
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_origin belle_sdp_origin_t;
+BELLESIP_EXPORT belle_sdp_origin_t* belle_sdp_origin_new(void);
+BELLESIP_EXPORT belle_sdp_origin_t* belle_sdp_origin_parse (const char* origin);
+BELLESIP_EXPORT belle_sdp_origin_t* belle_sdp_origin_create(const char* user_name
+											, unsigned int session_id
+											, unsigned int session_version
+											, const char* network_type
+											, const char* addr_type
+											, const char* address);
+BELLESIP_EXPORT const char* belle_sdp_origin_get_address(const belle_sdp_origin_t* origin);
+BELLESIP_EXPORT const char* belle_sdp_origin_get_address_type(const belle_sdp_origin_t* origin);
+BELLESIP_EXPORT const char* belle_sdp_origin_get_network_type(const belle_sdp_origin_t* origin);
+BELLESIP_EXPORT unsigned int belle_sdp_origin_get_session_id(const belle_sdp_origin_t* origin);
+BELLESIP_EXPORT unsigned int belle_sdp_origin_get_session_version(const belle_sdp_origin_t* origin);
+BELLESIP_EXPORT const char* belle_sdp_origin_get_username(const belle_sdp_origin_t* origin);
+BELLESIP_EXPORT void belle_sdp_origin_set_address(belle_sdp_origin_t* origin, const char* address);
+BELLESIP_EXPORT void belle_sdp_origin_set_address_type(belle_sdp_origin_t* origin, const char* address);
+BELLESIP_EXPORT void belle_sdp_origin_set_network_type(belle_sdp_origin_t* origin, const char* network_type);
+BELLESIP_EXPORT void belle_sdp_origin_set_session_id(belle_sdp_origin_t* origin, unsigned int session_id);
+BELLESIP_EXPORT void belle_sdp_origin_set_session_version(belle_sdp_origin_t* origin, unsigned int version);
+BELLESIP_EXPORT void belle_sdp_origin_set_username(belle_sdp_origin_t* origin, const char* username);
+#define BELLE_SDP_ORIGIN(t) BELLE_SDP_CAST(t,belle_sdp_origin_t)
+/***************************************************************************************
+ * Phone
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_phone belle_sdp_phone_t;
+BELLESIP_EXPORT belle_sdp_phone_t* belle_sdp_phone_new(void);
+BELLESIP_EXPORT belle_sdp_phone_t* belle_sdp_phone_parse (const char* phone);
+BELLESIP_EXPORT const char* belle_sdp_phone_get_value(const belle_sdp_phone_t* phone);
+BELLESIP_EXPORT void belle_sdp_phone_set_value(belle_sdp_phone_t* phone, const char* value);
+#define BELLE_SDP_PHONE(t) BELLE_SDP_CAST(t,belle_sdp_phone_t)
+/***************************************************************************************
+ * Repeat time
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_repeate_time belle_sdp_repeate_time_t;
+BELLESIP_EXPORT belle_sdp_repeate_time_t* belle_sdp_repeate_time_new(void);
+BELLESIP_EXPORT belle_sdp_repeate_time_t* belle_sdp_repeate_time_parse (const char* repeate_time);
+BELLESIP_EXPORT const char* belle_sdp_repeate_time_get_value(const belle_sdp_repeate_time_t* repeate_time);
+BELLESIP_EXPORT void belle_sdp_repeate_time_set_value(belle_sdp_repeate_time_t* repeate_time, const char* value);
+#define BELLE_SDP_REPEATE_TIME(t) BELLE_SDP_CAST(t,belle_sdp_repeate_time_t)
+/***************************************************************************************
+ * Session Name
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_session_name belle_sdp_session_name_t;
+BELLESIP_EXPORT belle_sdp_session_name_t* belle_sdp_session_name_new(void);
+BELLESIP_EXPORT belle_sdp_session_name_t* belle_sdp_session_name_create (const char* name);
+BELLESIP_EXPORT const char* belle_sdp_session_name_get_value(const belle_sdp_session_name_t* session_name);
+BELLESIP_EXPORT void belle_sdp_session_name_set_value(belle_sdp_session_name_t* session_name, const char* value);
+#define BELLE_SDP_SESSION_NAME(t) BELLE_SDP_CAST(t,belle_sdp_session_name_t)
+/***************************************************************************************
+ * Time
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_time belle_sdp_time_t;
+BELLESIP_EXPORT belle_sdp_time_t* belle_sdp_time_new(void);
+BELLESIP_EXPORT belle_sdp_time_t* belle_sdp_time_parse (const char* time);
+
+BELLESIP_EXPORT int belle_sdp_time_get_start(const belle_sdp_time_t* time);
+BELLESIP_EXPORT int belle_sdp_time_get_stop(const belle_sdp_time_t* time);
+BELLESIP_EXPORT void belle_sdp_time_set_start(belle_sdp_time_t* time, int value);
+BELLESIP_EXPORT void belle_sdp_time_set_stop(belle_sdp_time_t* time, int value);
+#define BELLE_SDP_TIME(t) BELLE_SDP_CAST(t,belle_sdp_time_t)
+/***************************************************************************************
+ * Time description
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_time_description belle_sdp_time_description_t;
+BELLESIP_EXPORT belle_sdp_time_description_t* belle_sdp_time_description_new(void);
+BELLESIP_EXPORT belle_sdp_time_description_t* belle_sdp_time_description_parse (const char* time_description);
+BELLESIP_EXPORT belle_sdp_time_description_t* belle_sdp_time_description_create (int start,int stop);
+
+BELLESIP_EXPORT belle_sip_list_t* belle_sdp_time_description_get_repeate_times(const belle_sdp_time_description_t* time_description);
+BELLESIP_EXPORT belle_sdp_time_t* belle_sdp_time_description_get_time(const belle_sdp_time_description_t* time_description);
+BELLESIP_EXPORT void belle_sdp_time_description_set_repeate_times(belle_sdp_time_description_t* time_description, belle_sip_list_t* times);
+BELLESIP_EXPORT void belle_sdp_time_description_set_time(belle_sdp_time_description_t* time_description, belle_sdp_time_t* times);
+#define BELLE_SDP_TIME_DESCRIPTION(t) BELLE_SDP_CAST(t,belle_sdp_time_description_t)
+/***************************************************************************************
+ * URI
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_uri belle_sdp_uri_t;
+BELLESIP_EXPORT belle_sdp_uri_t* belle_sdp_uri_new(void);
+BELLESIP_EXPORT belle_sdp_uri_t* belle_sdp_uri_parse (const char* uri);
+BELLESIP_EXPORT const char* belle_sdp_uri_get_value(const belle_sdp_uri_t* uri);
+BELLESIP_EXPORT void belle_sdp_uri_set_value(belle_sdp_uri_t* uri, const char* value);
+#define BELLE_SDP_URI(t) BELLE_SDP_CAST(t,belle_sdp_uri_t)
+/***************************************************************************************
+ * Version
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_version belle_sdp_version_t;
+belle_sdp_version_t* belle_sdp_version_new(void);
+BELLESIP_EXPORT belle_sdp_version_t* belle_sdp_version_create(int version);
+BELLESIP_EXPORT int belle_sdp_version_get_version(const belle_sdp_version_t* version);
+BELLESIP_EXPORT void belle_sdp_version_set_version(belle_sdp_version_t* version, int value);
+#define BELLE_SDP_VERSION(t) BELLE_SDP_CAST(t,belle_sdp_version_t)
+
+/***************************************************************************************
+ * Session Description
+ *
+ **************************************************************************************/
+typedef struct _belle_sdp_session_description belle_sdp_session_description_t;
+BELLESIP_EXPORT belle_sdp_session_description_t* belle_sdp_session_description_new(void);
+BELLESIP_EXPORT belle_sdp_session_description_t* belle_sdp_session_description_parse (const char* session_description);
+
+BELLESIP_EXPORT belle_sip_list_t * belle_sdp_session_description_get_attributes(const belle_sdp_session_description_t *session_description);
+BELLESIP_EXPORT const char*	belle_sdp_session_description_get_attribute_value(const belle_sdp_session_description_t* session_description, const char* name);
+BELLESIP_EXPORT const belle_sdp_attribute_t*	belle_sdp_session_description_get_attribute(const belle_sdp_session_description_t* session_description, const char* name);
+BELLESIP_EXPORT int	belle_sdp_session_description_get_bandwidth(const belle_sdp_session_description_t* session_description, const char* name);
+BELLESIP_EXPORT belle_sip_list_t*	belle_sdp_session_description_get_bandwidths(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sdp_connection_t*	belle_sdp_session_description_get_connection(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sip_list_t* belle_sdp_session_description_get_emails(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sdp_info_t* belle_sdp_session_description_get_info(const belle_sdp_session_description_t* session_description);
+/*belle_sdp_key_t*	belle_sdp_session_description_get_key(const belle_sdp_session_description_t* session_description);*/
+BELLESIP_EXPORT belle_sip_list_t* belle_sdp_session_description_get_media_descriptions(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sdp_origin_t*	belle_sdp_session_description_get_origin(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sip_list_t* belle_sdp_session_description_get_phones(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sdp_session_name_t* belle_sdp_session_description_get_session_name(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sip_list_t* belle_sdp_session_description_get_time_descriptions(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sdp_uri_t* belle_sdp_session_description_get_uri(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sdp_version_t*	belle_sdp_session_description_get_version(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT belle_sdp_uri_t* belle_sdp_session_description_get_zone_adjustments(const belle_sdp_session_description_t* session_description);
+BELLESIP_EXPORT void belle_sdp_session_description_remove_attribute(belle_sdp_session_description_t* session_description, const char* name);
+BELLESIP_EXPORT void belle_sdp_session_description_remove_bandwidth(belle_sdp_session_description_t* session_description, const char* name);
+BELLESIP_EXPORT void belle_sdp_session_description_set_attribute_value(belle_sdp_session_description_t* session_description, const char* name, const char* value);
+BELLESIP_EXPORT void belle_sdp_session_description_add_attribute(belle_sdp_session_description_t* session_description, const belle_sdp_attribute_t* attribute);
+BELLESIP_EXPORT void belle_sdp_session_description_set_attributes(belle_sdp_session_description_t* session_description, belle_sip_list_t* Attributes);
+BELLESIP_EXPORT void belle_sdp_session_description_set_bandwidth(belle_sdp_session_description_t* session_description, const char* name, int value);
+BELLESIP_EXPORT void belle_sdp_session_description_set_bandwidths(belle_sdp_session_description_t* session_description, belle_sip_list_t* bandwidths);
+BELLESIP_EXPORT void belle_sdp_session_description_add_bandwidth(belle_sdp_session_description_t* session_description, const belle_sdp_bandwidth_t* bandwidth);
+BELLESIP_EXPORT void belle_sdp_session_description_set_connection(belle_sdp_session_description_t* session_description, belle_sdp_connection_t* conn);
+BELLESIP_EXPORT void belle_sdp_session_description_set_emails(belle_sdp_session_description_t* session_description, belle_sip_list_t* emails);
+BELLESIP_EXPORT void belle_sdp_session_description_set_info(belle_sdp_session_description_t* session_description, belle_sdp_info_t* i);
+/*void belle_sdp_session_description_set_key(belle_sdp_session_description_t* session_description, belle_sdp_key_t* key);*/
+BELLESIP_EXPORT void belle_sdp_session_description_set_media_descriptions(belle_sdp_session_description_t* session_description, belle_sip_list_t* mediaDescriptions);
+BELLESIP_EXPORT void belle_sdp_session_description_add_media_description(belle_sdp_session_description_t* session_description, belle_sdp_media_description_t* media_description);
+BELLESIP_EXPORT void belle_sdp_session_description_set_origin(belle_sdp_session_description_t* session_description, belle_sdp_origin_t* origin);
+BELLESIP_EXPORT void belle_sdp_session_description_set_phones(belle_sdp_session_description_t* session_description, belle_sip_list_t* phones);
+BELLESIP_EXPORT void belle_sdp_session_description_set_session_name(belle_sdp_session_description_t* session_description, belle_sdp_session_name_t* sessionName);
+BELLESIP_EXPORT void belle_sdp_session_description_set_time_descriptions(belle_sdp_session_description_t* session_description, belle_sip_list_t* times);
+BELLESIP_EXPORT void belle_sdp_session_description_set_time_description(belle_sdp_session_description_t* session_description, belle_sdp_time_description_t* time_desc);
+BELLESIP_EXPORT void belle_sdp_session_description_set_uri(belle_sdp_session_description_t* session_description, belle_sdp_uri_t* uri);
+BELLESIP_EXPORT void belle_sdp_session_description_set_version(belle_sdp_session_description_t* session_description, belle_sdp_version_t* v);
+BELLESIP_EXPORT void belle_sdp_session_description_set_zone_adjustments(belle_sdp_session_description_t* session_description, belle_sdp_uri_t* zoneAdjustments);
+#define BELLE_SDP_SESSION_DESCRIPTION(t) BELLE_SDP_CAST(t,belle_sdp_session_description_t)
+
+BELLE_SIP_END_DECLS
+#endif /* BELLE_SDP_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/belle-sip.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/belle-sip.h"
new file mode 100755
index 0000000..709fb80
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/belle-sip.h"
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_H
+#define BELLE_SIP_H
+
+#include "belle-sip/types.h"
+#include "belle-sip/utils.h"
+#include "belle-sip/list.h"
+#include "belle-sip/listener.h"
+#include "belle-sip/mainloop.h"
+#include "belle-sip/sip-uri.h"
+#include "belle-sip/headers.h"
+#include "belle-sip/parameters.h"
+#include "belle-sip/message.h"
+#include "belle-sip/refresher.h"
+#include "belle-sip/transaction.h"
+#include "belle-sip/dialog.h"
+#include "belle-sip/sipstack.h"
+#include "belle-sip/resolver.h"
+#include "belle-sip/listeningpoint.h"
+#include "belle-sip/provider.h"
+#include "belle-sip/auth-helper.h"
+#include "belle-sip/generic-uri.h"
+#include "belle-sip/http-listener.h"
+#include "belle-sip/http-provider.h"
+#include "belle-sip/http-listener.h"
+#include "belle-sip/http-message.h"
+#include "belle-sip/belle-sdp.h"
+#include "belle-sip/bodyhandler.h"
+#include "belle-sip/mdns_register.h"
+
+#ifdef __ANDROID__
+#include "belle-sip/wakelock.h"
+#endif
+
+
+#define BELLE_SIP_POINTER_TO_INT(p)	((int)(intptr_t)(p))
+#define BELLE_SIP_INT_TO_POINTER(i)	((void*)(intptr_t)(i))
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/bodyhandler.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/bodyhandler.h"
new file mode 100755
index 0000000..3a64eef
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/bodyhandler.h"
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_sip_body_handler_h
+#define belle_sip_body_handler_h
+
+BELLE_SIP_BEGIN_DECLS
+
+#define BELLE_SIP_BODY_HANDLER(obj)	BELLE_SIP_CAST(obj,belle_sip_body_handler_t)
+/*
+ * Body handler base class.
+**/
+
+typedef void (*belle_sip_body_handler_progress_callback_t)(belle_sip_body_handler_t *obj, belle_sip_message_t *msg, void *user_data, size_t transfered, size_t expected_total);
+
+BELLESIP_EXPORT void belle_sip_body_handler_add_header(belle_sip_body_handler_t *obj, belle_sip_header_t *header);
+BELLESIP_EXPORT void belle_sip_body_handler_remove_header_from_ptr(belle_sip_body_handler_t *obj, belle_sip_header_t *header);
+BELLESIP_EXPORT const belle_sip_list_t* belle_sip_body_handler_get_headers(const belle_sip_body_handler_t *obj);
+BELLESIP_EXPORT size_t belle_sip_body_handler_get_size(const belle_sip_body_handler_t *obj);
+BELLESIP_EXPORT void belle_sip_body_handler_set_size(belle_sip_body_handler_t *obj, size_t size);
+BELLESIP_EXPORT size_t belle_sip_body_handler_get_transfered_size(const belle_sip_body_handler_t *obj);
+
+
+/*
+ * body handler that read/write from a memory buffer.
+**/
+
+#define BELLE_SIP_MEMORY_BODY_HANDLER(obj)	BELLE_SIP_CAST(obj,belle_sip_memory_body_handler_t)
+
+BELLESIP_EXPORT belle_sip_memory_body_handler_t *belle_sip_memory_body_handler_new(belle_sip_body_handler_progress_callback_t progress_cb, void *data);
+BELLESIP_EXPORT belle_sip_memory_body_handler_t *belle_sip_memory_body_handler_new_copy_from_buffer(const void *buffer, size_t bufsize,
+							belle_sip_body_handler_progress_callback_t cb, void *user_data);
+BELLESIP_EXPORT belle_sip_memory_body_handler_t *belle_sip_memory_body_handler_new_from_buffer(void *buffer, size_t bufsize,
+						belle_sip_body_handler_progress_callback_t cb, void *user_data);
+
+BELLESIP_EXPORT void *belle_sip_memory_body_handler_get_buffer(const belle_sip_memory_body_handler_t *obj);
+BELLESIP_EXPORT void belle_sip_memory_body_handler_set_buffer(belle_sip_memory_body_handler_t *obj, void *buffer);
+BELLESIP_EXPORT int belle_sip_memory_body_handler_apply_encoding(belle_sip_memory_body_handler_t *obj, const char *encoding);
+BELLESIP_EXPORT int belle_sip_memory_body_handler_unapply_encoding(belle_sip_memory_body_handler_t *obj, const char *encoding);
+
+/*
+ * body handler that get/puts data from application.
+**/
+
+#define BELLE_SIP_USER_BODY_HANDLER(obj)	BELLE_SIP_CAST(obj,belle_sip_user_body_handler_t)
+
+typedef void (*belle_sip_user_body_handler_start_callback_t)(belle_sip_user_body_handler_t *obj, void *user_data);
+
+typedef void (*belle_sip_user_body_handler_recv_callback_t)(belle_sip_user_body_handler_t *obj, belle_sip_message_t *msg, void *user_data, size_t offset, uint8_t* buffer, size_t size);
+
+typedef int (*belle_sip_user_body_handler_send_callback_t)(belle_sip_user_body_handler_t *obj, belle_sip_message_t *msg, void *user_data, size_t offset, uint8_t* buffer, size_t *size);
+
+typedef void (*belle_sip_user_body_handler_stop_callback_t)(belle_sip_user_body_handler_t *obj, void *user_data);
+
+BELLESIP_EXPORT belle_sip_user_body_handler_t *belle_sip_user_body_handler_new(
+	size_t total_size,
+	belle_sip_body_handler_progress_callback_t progress_cb,
+	belle_sip_user_body_handler_start_callback_t start_cb,
+	belle_sip_user_body_handler_recv_callback_t recv_cb,
+	belle_sip_user_body_handler_send_callback_t send_cb,
+	belle_sip_user_body_handler_stop_callback_t stop_cb,
+	void *data);
+
+
+/**
+ * Body handler that gets/puts data from/to a file.
+**/
+
+#define BELLE_SIP_FILE_BODY_HANDLER(obj)	BELLE_SIP_CAST(obj, belle_sip_file_body_handler_t)
+
+BELLESIP_EXPORT belle_sip_file_body_handler_t *belle_sip_file_body_handler_new(const char *filepath, belle_sip_body_handler_progress_callback_t progress_cb, void *data);
+BELLESIP_EXPORT size_t belle_sip_file_body_handler_get_file_size(belle_sip_file_body_handler_t *file_bh);
+BELLESIP_EXPORT void belle_sip_file_body_handler_set_user_body_handler(belle_sip_file_body_handler_t *file_bh, belle_sip_user_body_handler_t *user_bh);
+
+/*
+ * Multipart body handler
+ */
+#define BELLE_SIP_MULTIPART_BODY_HANDLER(obj)	BELLE_SIP_CAST(obj,belle_sip_multipart_body_handler_t)
+
+BELLESIP_EXPORT const char *belle_sip_multipart_body_handler_get_boundary(const belle_sip_multipart_body_handler_t *obj);
+BELLESIP_EXPORT belle_sip_multipart_body_handler_t *belle_sip_multipart_body_handler_new(belle_sip_body_handler_progress_callback_t progress_cb, void *data, belle_sip_body_handler_t *first_part, const char *boundary);
+BELLESIP_EXPORT belle_sip_multipart_body_handler_t *belle_sip_multipart_body_handler_new_from_buffer(const void *buffer, size_t bufsize, const char *boundary);
+BELLESIP_EXPORT void belle_sip_multipart_body_handler_add_part(belle_sip_multipart_body_handler_t *obj, belle_sip_body_handler_t *part);
+BELLESIP_EXPORT const belle_sip_list_t* belle_sip_multipart_body_handler_get_parts(const belle_sip_multipart_body_handler_t *obj);
+
+/*
+ *multipar body in sens of rfc2387
+ */
+BELLESIP_EXPORT unsigned int belle_sip_multipart_body_handler_is_related(const belle_sip_multipart_body_handler_t *obj);
+BELLESIP_EXPORT void belle_sip_multipart_body_handler_set_related(belle_sip_multipart_body_handler_t *obj, unsigned int yesno);
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/defs.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/defs.h"
new file mode 100755
index 0000000..e59717b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/defs.h"
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_DEFS_H
+#define BELLE_SIP_DEFS_H
+
+#ifdef __cplusplus
+#define BELLE_SIP_BEGIN_DECLS		extern "C"{
+#define BELLE_SIP_END_DECLS		}
+#else
+#define BELLE_SIP_BEGIN_DECLS
+#define BELLE_SIP_END_DECLS
+#endif
+
+#ifdef _MSC_VER
+#define BELLESIP_INLINE __inline
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+#include <inttypes.h>
+#define BELLESIP_INLINE inline
+#endif
+
+#ifdef _MSC_VER
+	#ifdef BELLESIP_STATIC
+		#define BELLESIP_EXPORT
+	#else
+		#ifdef BELLESIP_EXPORTS
+			#define BELLESIP_EXPORT __declspec(dllexport)
+		#else
+			#define BELLESIP_EXPORT __declspec(dllimport)
+		#endif
+	#endif
+#else
+	#define BELLESIP_EXPORT
+#endif
+
+#define BELLESIP_UNUSED(a) (void)a;
+
+#undef TRUE
+#define TRUE 1
+
+
+#undef FALSE
+#define FALSE 0
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/dialog.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/dialog.h"
new file mode 100755
index 0000000..05591f6
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/dialog.h"
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_sip_dialog_h
+#define belle_sip_dialog_h
+
+enum belle_sip_dialog_state{
+	BELLE_SIP_DIALOG_NULL,
+	BELLE_SIP_DIALOG_EARLY,
+	BELLE_SIP_DIALOG_CONFIRMED,
+	BELLE_SIP_DIALOG_TERMINATED
+};
+
+typedef enum belle_sip_dialog_state belle_sip_dialog_state_t;
+
+BELLE_SIP_BEGIN_DECLS
+
+BELLESIP_EXPORT const char* belle_sip_dialog_state_to_string(const belle_sip_dialog_state_t state);
+
+BELLESIP_EXPORT belle_sip_request_t *belle_sip_dialog_create_ack(belle_sip_dialog_t *dialog, unsigned int cseq);
+
+/**
+ * Create a request part of this dialog.
+**/
+BELLESIP_EXPORT belle_sip_request_t *belle_sip_dialog_create_request(belle_sip_dialog_t *dialog, const char *method);
+/**
+ * Create a request within a dialog keeping non system header from an initial request. This function is very useful to resend request after expiration or chalenge.
+ * @param obj dialog associated to the request
+ * @param initial_req, all headers + body are re-used from this request except: Via,From, To, Allows, CSeq, Call-ID, Max-Forwards
+ *
+ */
+BELLESIP_EXPORT belle_sip_request_t * belle_sip_dialog_create_request_from(belle_sip_dialog_t *obj, const belle_sip_request_t *initial_req);
+
+/**
+ * Create a new request part of this dialog. If dialog is busy (pending transaction), the request can be created anyway and will be sent by the transaction
+ * when the dialog becomes available.
+**/
+BELLESIP_EXPORT belle_sip_request_t * belle_sip_dialog_create_queued_request(belle_sip_dialog_t *obj, const char *method);
+
+/**
+ * Create a new request part of this dialog keeping non system header from an initial request. If dialog is busy (pending transaction), the request can be created anyway and will be sent by the transaction
+ * when the dialog becomes available.
+ * @param obj dialog associated to the request
+ * @param initial_req, all headers + body are re-used from this request except: Via,From, To, Allows, CSeq, Call-ID, Max-Forwards
+**/
+BELLESIP_EXPORT belle_sip_request_t *belle_sip_dialog_create_queued_request_from(belle_sip_dialog_t *obj, const belle_sip_request_t *initial_req);
+
+BELLESIP_EXPORT void belle_sip_dialog_delete(belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT void *belle_sip_dialog_get_application_data(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT void belle_sip_dialog_set_application_data(belle_sip_dialog_t *dialog, void *data);
+
+BELLESIP_EXPORT const belle_sip_header_call_id_t *belle_sip_dialog_get_call_id(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT const belle_sip_header_address_t *belle_sip_dialog_get_local_party(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT const belle_sip_header_address_t *belle_sip_dialog_get_remote_party(const belle_sip_dialog_t *dialog);
+/**
+ * get the value of the last cseq used to issue a request
+ * @return local cseq
+ **/
+BELLESIP_EXPORT unsigned int belle_sip_dialog_get_local_seq_number(const belle_sip_dialog_t *dialog);
+
+unsigned int belle_sip_dialog_get_remote_seq_number(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT const char *belle_sip_dialog_get_local_tag(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT const char *belle_sip_dialog_get_remote_tag(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT const belle_sip_header_address_t *belle_sip_dialog_get_remote_target(belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT const belle_sip_list_t* belle_sip_dialog_get_route_set(belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT belle_sip_dialog_state_t belle_sip_dialog_get_state(const belle_sip_dialog_t *dialog);
+/**
+ * return the dialog state before last transition. Can be useful to detect early avorted dialogs
+ * @param dialog
+ * @returns state
+ **/
+BELLESIP_EXPORT belle_sip_dialog_state_t belle_sip_dialog_get_previous_state(const belle_sip_dialog_t *dialog);
+
+
+BELLESIP_EXPORT int belle_sip_dialog_is_server(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT int belle_sip_dialog_is_secure(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT void belle_sip_dialog_send_ack(belle_sip_dialog_t *dialog, belle_sip_request_t *request);
+
+BELLESIP_EXPORT void belle_sip_dialog_terminate_on_bye(belle_sip_dialog_t *dialog, int val);
+/**
+ * Give access to the last transaction processed by a dialog. Can be useful to get reason code for dialog terminated before reaching established state
+ * @param dialog
+ * @return last transaction
+ */
+BELLESIP_EXPORT belle_sip_transaction_t* belle_sip_dialog_get_last_transaction(const belle_sip_dialog_t *dialog);
+
+BELLESIP_EXPORT int belle_sip_dialog_request_pending(const belle_sip_dialog_t *dialog);
+
+/*for debugging purpose only, allow to disable checking for pending transaction*/
+BELLESIP_EXPORT int belle_sip_dialog_pending_trans_checking_enabled( const belle_sip_dialog_t *dialog) ;
+BELLESIP_EXPORT int belle_sip_dialog_enable_pending_trans_checking(belle_sip_dialog_t *dialog, int value) ;
+
+BELLESIP_EXPORT int belle_sip_dialog_expired(const belle_sip_dialog_t *dialog);
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/dict.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/dict.h"
new file mode 100755
index 0000000..e3f74f3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/dict.h"
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DICT_H
+#define DICT_H
+
+#ifndef _WIN32
+#include <sys/types.h>
+#endif
+
+
+#include "belle-sip/object.h"
+
+BELLE_SIP_BEGIN_DECLS
+
+typedef struct belle_sip_dict belle_sip_dict_t;
+#define BELLE_SIP_DICT(obj) BELLE_SIP_CAST(obj,belle_sip_dict_t)
+
+/**
+ * @brief belle_sip_dict_create
+ * @return an instance of a belle_sip_dict_t object.
+ * @note The object is not owned by default.
+ * @note all belle_sip_dict_set_* functions will overwrite existing values.
+ */
+BELLESIP_EXPORT belle_sip_dict_t* belle_sip_dict_create(void);
+
+/**
+ * @brief belle_sip_dict_set_int stores an integer into the dictionary
+ * @param obj the dictionary instance
+ * @param key the name of the integer to store
+ * @param value value to store
+ */
+BELLESIP_EXPORT void belle_sip_dict_set_int(belle_sip_dict_t* obj, const char* key, int value);
+
+/**
+ * @brief belle_sip_dict_get_int retrieves an integer from the dictionary
+ * @param obj the dictionary instance
+ * @param key name of the integer to retrieve
+ * @param default_value value to return if the key is not found
+ * @return the searched integer if the key exists, default_value if not found
+ */
+BELLESIP_EXPORT int belle_sip_dict_get_int(belle_sip_dict_t* obj, const char* key, int default_value);
+
+/**
+ * @brief belle_sip_dict_set_string stores a string into the dictionary
+ * @param obj the dictionary instance
+ * @param key the name of the string to store
+ * @param value value to store
+ */
+BELLESIP_EXPORT void belle_sip_dict_set_string(belle_sip_dict_t* obj, const char* key, const char*value);
+/**
+ * @brief belle_sip_dict_get_string retrieves a string from the dictionary
+ * @param obj the dictionary instance
+ * @param key the name of the string to retrieve
+ * @param default_value
+ * @return the searched string if the key exists, default_value if not found
+ */
+BELLESIP_EXPORT const char* belle_sip_dict_get_string(belle_sip_dict_t* obj, const char* key, const char* default_value);
+
+/**
+ * @brief belle_sip_dict_set_int64 stores an int64 in the dictionary
+ * @param obj the dictionary instance
+ * @param key the name of the integer to store
+ * @param value value to store
+ */
+BELLESIP_EXPORT void belle_sip_dict_set_int64(belle_sip_dict_t* obj, const char* key, int64_t value);
+
+/**
+ * @brief belle_sip_dict_get_int64 retrieves an int64 from the dictionary
+ * @param obj the dictionary instance
+ * @param key the name of the integer to retrieve
+ * @param default_value value to return if the key is not found
+ * @return the searched int64 if the key exists, default_value if not found
+ */
+BELLESIP_EXPORT int64_t belle_sip_dict_get_int64(belle_sip_dict_t* obj, const char* key, int64_t default_value);
+
+/**
+ * @brief belle_sip_dict_remove will erase the value for a key
+ * @param obj the dictionary instance
+ * @param key the name of the integer to remove
+ * @return 0 if the key was found, 1 otherwise
+ */
+BELLESIP_EXPORT int belle_sip_dict_remove(belle_sip_dict_t* obj, const char* key);
+
+/**
+ * @brief belle_sip_dict_clear will clear the object's dictionary.
+ * @param obj the dictionary instance
+ */
+BELLESIP_EXPORT void belle_sip_dict_clear(belle_sip_dict_t* obj);
+
+/**
+ * Clones the source dictionary into the dst dictionary. The dst dictionary is cleared before the cloning
+ * is done.
+ * @param src source dictionary
+ * @param dst destination dictionary
+ */
+BELLESIP_EXPORT void belle_sip_dict_clone( const belle_sip_dict_t* src, belle_sip_dict_t* dst);
+
+/**
+  * Merge the source dictionary into the destination dictionary.
+  *
+  * Same function as #belle_sip_dict_clone, except the destination dictionary is not cleared before inserting the source data.
+  * This overwrites common keys, and keeps existing keys.
+  */
+BELLESIP_EXPORT void belle_sip_dict_merge( const belle_sip_dict_t* src, belle_sip_dict_t* dst);
+
+/**
+ * @brief belle_sip_dict_haskey tells if a key exists in the dictionary.
+ * @param obj the dictionary instance
+ * @param key the key to look for
+ * @return 1 if the key exists, 0 otherwise
+ * @todo create unit test
+ */
+BELLESIP_EXPORT int belle_sip_dict_haskey(const belle_sip_dict_t* obj, const char* key);
+
+/**
+ * Apply a function for all keys stored in the dictionary
+ */
+BELLESIP_EXPORT void belle_sip_dict_foreach(const belle_sip_dict_t* obj, void (*apply_func)(const char*, void*, void*), void* userdata);
+
+BELLE_SIP_END_DECLS
+
+#endif // DICT_H
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/generic-uri.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/generic-uri.h"
new file mode 100755
index 0000000..e542165
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/generic-uri.h"
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_GENERIC_URI_H_
+#define BELLE_GENERIC_URI_H_
+
+#include "belle-sip/defs.h"
+#include "belle-sip/list.h"
+#include "belle-sip/utils.h"
+
+BELLE_SIP_BEGIN_DECLS
+
+/**
+ *
+ */
+BELLESIP_EXPORT belle_generic_uri_t* belle_generic_uri_new(void);
+
+/**
+ *
+ */
+BELLESIP_EXPORT belle_generic_uri_t* belle_generic_uri_parse (const char* uri);
+/*
+ * 	          Returns the host part of this uri.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_generic_uri_get_host(const belle_generic_uri_t* uri) ;
+/**
+ * 	          Returns the value of the maddr parameter, or null if this is not set.
+ *
+ */
+BELLESIP_EXPORT int	belle_generic_uri_get_port(const belle_generic_uri_t* uri) ;
+/**
+ * Returns the port of the uri, if not specified in the uri returns the well known port according to the transport.
+**/
+BELLESIP_EXPORT int belle_generic_uri_get_listening_port(const belle_generic_uri_t *uri);
+
+/**
+ * 	          Returns the user part of this URI.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_generic_uri_get_user(const belle_generic_uri_t* uri) ;
+
+/**
+ * 	          Gets user password of uri, or null if it is not set.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_generic_uri_get_user_password(const belle_generic_uri_t* uri) ;
+
+/**
+ *
+ * 	          Returns uri scheme.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_generic_uri_get_scheme(const belle_generic_uri_t* uri) ;
+/**
+ *
+ * 	          Returns uri path.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_generic_uri_get_path(const belle_generic_uri_t* uri) ;
+/**
+ *
+ * 	          Returns uri query.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_generic_uri_get_query(const belle_generic_uri_t* uri) ;
+
+
+/**
+ * 	          Removes the port part of this uri.
+ *
+ */
+BELLESIP_EXPORT void	belle_generic_uri_remove_port(belle_generic_uri_t* uri) ;
+/**
+ * 	          Set the host part of this uri to the newly supplied host parameter.
+ *
+ */
+BELLESIP_EXPORT void	belle_generic_uri_set_host(belle_generic_uri_t* uri,const char*host) ;
+
+/**
+ * 	          Set the port part of this uri to the newly supplied port parameter.
+ *
+ */
+BELLESIP_EXPORT void	belle_generic_uri_set_port(belle_generic_uri_t* uri, int port) ;
+/**
+ * 	          Sets the scheme of this URI .
+ *
+ */
+BELLESIP_EXPORT void	belle_generic_uri_set_scheme(belle_generic_uri_t* uri,const char* scheme) ;
+/**
+ * 	          Sets the path of this URI .
+ *
+ */
+BELLESIP_EXPORT void	belle_generic_uri_set_path(belle_generic_uri_t* uri,const char* scheme) ;
+/**
+ * 	          Sets the query of this URI .
+ *
+ */
+BELLESIP_EXPORT void	belle_generic_uri_set_query(belle_generic_uri_t* uri,const char* scheme) ;
+
+/**
+ *  	          Sets the user of uri.
+ *
+ */
+BELLESIP_EXPORT void	belle_generic_uri_set_user(belle_generic_uri_t* uri,const char*user) ;
+
+/**
+ * 	          Sets the user password associated with the user of uri.
+ *
+ */
+BELLESIP_EXPORT void	belle_generic_uri_set_user_password(belle_generic_uri_t* uri,const char*userPassword) ;
+
+/**
+ * 	          This method returns the URI as a string.
+ *
+ */
+BELLESIP_EXPORT char*	belle_generic_uri_to_string(belle_generic_uri_t* uri) ;
+
+BELLESIP_EXPORT belle_sip_error_code belle_generic_uri_marshal(const belle_generic_uri_t* uri, char* buff, size_t buff_size, size_t *offset);
+
+
+/**
+ * 	         gets opaque part of this uri if hierarchies part not detected.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_generic_uri_get_opaque_part(const belle_generic_uri_t* uri) ;
+
+/**
+ * 	         sets opaque part of this uri. Means hierarchies part is ignored if present.
+ *
+ */
+BELLESIP_EXPORT void belle_generic_uri_set_opaque_part(belle_generic_uri_t* uri,const char * opaque_part) ;
+
+
+#define BELLE_GENERIC_URI(obj) BELLE_SIP_CAST(obj,belle_generic_uri_t)
+
+
+
+
+BELLE_SIP_END_DECLS
+
+
+
+
+#endif /* belle_generic_uri_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/headers.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/headers.h"
new file mode 100755
index 0000000..fcdb6e9
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/headers.h"
@@ -0,0 +1,871 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef HEADERS_H_
+#define HEADERS_H_
+
+#include "belle-sip/defs.h"
+#include "belle-sip/sip-uri.h"
+#include "belle-sip/generic-uri.h"
+#include "belle-sip/utils.h"
+#include "belle-sip/parameters.h"
+
+#include <time.h>
+
+BELLE_SIP_BEGIN_DECLS
+
+
+/***************************************************************************************
+ * header address
+ *
+ **************************************************************************************/
+
+typedef struct _belle_sip_header_address belle_sip_header_address_t;
+
+BELLESIP_EXPORT belle_sip_header_address_t* belle_sip_header_address_new(void);
+/*
+ * creates an address from a display name and an uri
+ * Note the uri not copied but only its ref count is incremented
+ * @param  display display name. May be null.
+ * @param uri uri set to the newly created header_address
+ * @return
+ * */
+BELLESIP_EXPORT belle_sip_header_address_t* belle_sip_header_address_create(const char* display, belle_sip_uri_t* uri);
+
+/*
+ * creates an address from a display name and an absolute uri
+ * Note the uri not copied but only its ref count is incremented
+ * @param  display display name. May be null.
+ * @param uri uri set to the newly created header_address
+ * @return
+ * */
+BELLESIP_EXPORT belle_sip_header_address_t* belle_sip_header_address_create2(const char* display, belle_generic_uri_t* uri);
+
+
+BELLESIP_EXPORT belle_sip_header_address_t* belle_sip_header_address_parse (const char* address) ;
+
+/*
+ same as belle_sip_header_address_parse but with less syntax checking
+ */
+BELLESIP_EXPORT belle_sip_header_address_t* belle_sip_header_address_fast_parse (const char* address) ;
+
+
+/**
+ * returns a sip uri. A header address cannot have both a sip uri and an absolute uri.
+ */
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_header_address_get_uri(const belle_sip_header_address_t* address);
+/**
+ * set an absolute uri. A header address cannot have both a sip uri and an absolute uri. This function also to absolute uri to NULL
+ */
+BELLESIP_EXPORT void belle_sip_header_address_set_uri(belle_sip_header_address_t* address, belle_sip_uri_t* uri);
+
+/**
+ * returns an absolute uri. A header address cannot have both a sip uri and an absolute uri.
+ */
+BELLESIP_EXPORT belle_generic_uri_t* belle_sip_header_address_get_absolute_uri(const belle_sip_header_address_t* address);
+/**
+ * set an absolute uri. A header address cannot have both a sip uri and an absolute uri. This function also to uri to NULL
+ */
+BELLESIP_EXPORT void belle_sip_header_address_set_absolute_uri(belle_sip_header_address_t* address, belle_generic_uri_t* uri);
+
+/**
+  * Enable automatic filling of the contact ip, port and transport according to the channel that sends this message.
+ **/
+BELLESIP_EXPORT void belle_sip_header_address_set_automatic(belle_sip_header_address_t *address, int automatic);
+
+BELLESIP_EXPORT int belle_sip_header_address_get_automatic(const belle_sip_header_address_t *address);
+
+
+/**
+ *
+ */
+BELLESIP_EXPORT const char* belle_sip_header_address_get_displayname(const belle_sip_header_address_t* address);
+/**
+ *
+ */
+BELLESIP_EXPORT void belle_sip_header_address_set_displayname(belle_sip_header_address_t* address, const char* uri);
+
+/*
+ * Clone both display name and an uri from an belle_sip_header_address_t to a newly allocated belle_sip_header_address_t
+ * @param orig, originating header adderss.
+ * @return belle_sip_header_address_t
+ * */
+BELLESIP_EXPORT belle_sip_header_address_t* belle_sip_header_address_clone(const belle_sip_header_address_t* orig);
+
+
+
+#define BELLE_SIP_HEADER_ADDRESS(t) BELLE_SIP_CAST(t,belle_sip_header_address_t)
+
+
+
+/***************************************************************************************
+ * header common
+ *
+ **************************************************************************************/
+
+BELLESIP_EXPORT belle_sip_header_t* belle_sip_header_parse (const char* header);
+BELLESIP_EXPORT belle_sip_header_t* belle_sip_header_create (const char* name,const char* value);
+BELLESIP_EXPORT belle_sip_header_t* belle_http_header_create (const char* name,const char* value);
+BELLESIP_EXPORT const char* belle_sip_header_get_name (const belle_sip_header_t* obj);
+BELLESIP_EXPORT void belle_sip_header_set_name (belle_sip_header_t* obj,const char* value);
+BELLESIP_EXPORT belle_sip_error_code belle_sip_header_marshal(belle_sip_header_t* header, char* buff, size_t buff_size, size_t *offset);
+BELLESIP_EXPORT const char *belle_sip_header_get_unparsed_value(belle_sip_header_t* obj);
+
+#define BELLE_SIP_HEADER(t) BELLE_SIP_CAST(t,belle_sip_header_t)
+
+/******************************
+ *
+ * Allow header inherit from header
+ *
+ ******************************/
+typedef struct _belle_sip_header_allow belle_sip_header_allow_t;
+
+belle_sip_header_allow_t* belle_sip_header_allow_new(void);
+
+BELLESIP_EXPORT belle_sip_header_allow_t* belle_sip_header_allow_parse (const char* allow) ;
+BELLESIP_EXPORT belle_sip_header_allow_t* belle_sip_header_allow_create (const char* methods) ;
+
+BELLESIP_EXPORT const char* belle_sip_header_allow_get_method(const belle_sip_header_allow_t* allow);
+BELLESIP_EXPORT void belle_sip_header_allow_set_method(belle_sip_header_allow_t* allow,const char* method);
+#define BELLE_SIP_HEADER_ALLOW(t) BELLE_SIP_CAST(t,belle_sip_header_allow_t)
+#define BELLE_SIP_ALLOW "Allow"
+
+/***********************
+ * Contact header object
+ ************************/
+typedef struct _belle_sip_header_contact belle_sip_header_contact_t;
+
+BELLESIP_EXPORT belle_sip_header_contact_t* belle_sip_header_contact_new(void);
+
+
+BELLESIP_EXPORT belle_sip_header_contact_t* belle_sip_header_contact_parse (const char* contact) ;
+
+BELLESIP_EXPORT belle_sip_header_contact_t* belle_sip_header_contact_create (const belle_sip_header_address_t* contact) ;
+
+
+/**
+* Returns the value of the expires parameter or -1 if no expires parameter was specified or if the parameter value cannot be parsed as an int.
+*@returns value of the expires parameter measured in delta-seconds, O implies removal of Registration specified in Contact Header.
+*
+*/
+ BELLESIP_EXPORT int	belle_sip_header_contact_get_expires(const belle_sip_header_contact_t* contact);
+/**
+ * Returns the value of the q-value parameter of this ContactHeader. The q-value parameter indicates the relative preference amongst a set of locations. q-values are decimal numbers from 0 to 1, with higher values indicating higher preference.
+ * @return the q-value parameter of this ContactHeader, -1 if the q-value is not set.
+ */
+ BELLESIP_EXPORT float	belle_sip_header_contact_get_qvalue(const belle_sip_header_contact_t* contact);
+ /**
+  * Returns a boolean value that indicates if the contact header has the format of Contact: *.
+  * @return true if this is a wildcard address, false otherwise.
+  */
+ BELLESIP_EXPORT unsigned int belle_sip_header_contact_is_wildcard(const belle_sip_header_contact_t* contact);
+ /**
+ *
+ */
+ BELLESIP_EXPORT int belle_sip_header_contact_set_expires(belle_sip_header_contact_t* contact, int expires);
+/**
+ *  Sets the qValue value of the Name Address.
+ */
+ BELLESIP_EXPORT int belle_sip_header_contact_set_qvalue(belle_sip_header_contact_t* contact, float qvalue);
+/**
+ * Sets a wildcard on this contact address that is "*" is assigned to the contact header so that the header will have the format of Contact: *.
+ *
+ */
+ BELLESIP_EXPORT void belle_sip_header_contact_set_wildcard(belle_sip_header_contact_t* contact,unsigned int is_wildcard);
+
+/** Contact header equality function
+  * @return 0 if not equals
+  *
+  * */
+ BELLESIP_EXPORT unsigned int belle_sip_header_contact_equals(const belle_sip_header_contact_t* a,const belle_sip_header_contact_t* b);
+
+/** Contact header equality function, same as #belle_sip_header_contact_equals but return 0 if equals, very useful with #belle_sip_list
+   * @return 0 if equals
+   *
+   * */
+ BELLESIP_EXPORT unsigned int belle_sip_header_contact_not_equals(const belle_sip_header_contact_t* a,const belle_sip_header_contact_t* b);
+
+/** Contact header equality function
+  * @return 0 if not equals
+  *
+  * */
+ BELLESIP_EXPORT unsigned int belle_sip_header_contact_equals_with_uri_omitting(const belle_sip_header_contact_t* a,const belle_sip_header_contact_t* b);
+
+/** Contact header equality function, same as #belle_sip_header_contact_equals but return 0 if equals, very useful with #belle_sip_list
+   * @return 0 if equals
+   *
+   * */
+ BELLESIP_EXPORT unsigned int belle_sip_header_contact_not_equals_with_uri_omitting(const belle_sip_header_contact_t* a,const belle_sip_header_contact_t* b);
+
+ /**
+  * Enable automatic filling of the contact ip, port and transport according to the channel that sends this message.
+  * @deprecated use belle_sip_header_address_set_automatic();
+ **/
+ BELLESIP_EXPORT void belle_sip_header_contact_set_automatic(belle_sip_header_contact_t *a, int enabled);
+
+ BELLESIP_EXPORT int belle_sip_header_contact_get_automatic(const belle_sip_header_contact_t *a);
+
+ /**
+  * Indicates whether a contact in automatic mode (see belle_sip_header_contact_set_automatic()) could be filled properly when the message was sent.
+  * If a message is sent through a connection that has just been initiated, public IP and port are unknown, they will be learned after receiving the first response.
+  * This can be used by the upper layer to decide to resubmit the request.
+ **/
+ BELLESIP_EXPORT int belle_sip_header_contact_is_unknown(const belle_sip_header_contact_t *a);
+
+#define BELLE_SIP_RANDOM_TAG ((const char*)-1)
+#define BELLE_SIP_HEADER_CONTACT(t) BELLE_SIP_CAST(t,belle_sip_header_contact_t)
+#define BELLE_SIP_CONTACT "Contact"
+ /******************************
+ * From header object inherent from header_address
+ *
+ ******************************/
+ typedef struct _belle_sip_header_from belle_sip_header_from_t;
+
+ BELLESIP_EXPORT belle_sip_header_from_t* belle_sip_header_from_new(void);
+
+ BELLESIP_EXPORT belle_sip_header_from_t* belle_sip_header_from_create(const belle_sip_header_address_t* address, const char *tag);
+
+ BELLESIP_EXPORT belle_sip_header_from_t* belle_sip_header_from_create2(const char *address, const char *tag);
+
+ BELLESIP_EXPORT belle_sip_header_from_t* belle_sip_header_from_parse(const char* from) ;
+
+ BELLESIP_EXPORT void belle_sip_header_from_set_tag(belle_sip_header_from_t* from, const char* tag);
+
+ BELLESIP_EXPORT const char* belle_sip_header_from_get_tag(const belle_sip_header_from_t* from);
+
+ BELLESIP_EXPORT void belle_sip_header_from_set_random_tag(belle_sip_header_from_t *obj);
+
+#define BELLE_SIP_HEADER_FROM(t) BELLE_SIP_CAST(t,belle_sip_header_from_t)
+#define BELLE_SIP_FROM "From"
+ /******************************
+ * To header object inherent from header_address
+ *
+ ******************************/
+ typedef struct _belle_sip_header_to belle_sip_header_to_t;
+
+ BELLESIP_EXPORT belle_sip_header_to_t* belle_sip_header_to_new(void);
+
+ BELLESIP_EXPORT belle_sip_header_to_t* belle_sip_header_to_parse(const char* to) ;
+
+ BELLESIP_EXPORT belle_sip_header_to_t* belle_sip_header_to_create(const belle_sip_header_address_t *address, const char *tag);
+
+ BELLESIP_EXPORT belle_sip_header_to_t* belle_sip_header_to_create2(const char *address, const char *tag);
+
+ BELLESIP_EXPORT void belle_sip_header_to_set_tag(belle_sip_header_to_t* from, const char* tag);
+
+ BELLESIP_EXPORT const char* belle_sip_header_to_get_tag(const belle_sip_header_to_t* from);
+
+ BELLESIP_EXPORT void belle_sip_header_to_set_random_tag(belle_sip_header_to_t *obj);
+
+#define BELLE_SIP_HEADER_TO(t) BELLE_SIP_CAST(t,belle_sip_header_to_t)
+#define BELLE_SIP_TO "To"
+
+/******************************
+ * Diversion header object inherent from header_address
+ *
+ ******************************/
+ typedef struct _belle_sip_header_diversion belle_sip_header_diversion_t;
+
+ BELLESIP_EXPORT belle_sip_header_diversion_t* belle_sip_header_diversion_new(void);
+
+ BELLESIP_EXPORT belle_sip_header_diversion_t* belle_sip_header_diversion_parse(const char* diversion) ;
+
+ BELLESIP_EXPORT belle_sip_header_diversion_t* belle_sip_header_diversion_create(const belle_sip_header_address_t *address, const char *tag);
+
+ BELLESIP_EXPORT belle_sip_header_diversion_t* belle_sip_header_diversion_create2(const char *address, const char *tag);
+
+ BELLESIP_EXPORT void belle_sip_header_diversion_set_tag(belle_sip_header_diversion_t* diversion, const char* tag);
+
+ BELLESIP_EXPORT const char* belle_sip_header_diversion_get_tag(const belle_sip_header_diversion_t* from);
+
+ BELLESIP_EXPORT void belle_sip_header_diversion_set_random_tag(belle_sip_header_diversion_t *obj);
+
+#define BELLE_SIP_HEADER_DIVERSION(t) BELLE_SIP_CAST(t,belle_sip_header_diversion_t)
+#define BELLE_SIP_DIVERSION "Diversion"
+
+/******************************
+ * Via header object inherent from header_address
+ *
+ ******************************/
+typedef struct _belle_sip_header_via belle_sip_header_via_t;
+
+BELLESIP_EXPORT belle_sip_header_via_t* belle_sip_header_via_new(void);
+BELLESIP_EXPORT belle_sip_header_via_t* belle_sip_header_via_create(const char *host, int port, const char *transport, const char *branch);
+BELLESIP_EXPORT belle_sip_header_via_t* belle_sip_header_via_parse (const char* via) ;
+BELLESIP_EXPORT const char*	belle_sip_header_via_get_branch(const belle_sip_header_via_t* via);
+BELLESIP_EXPORT const char*	belle_sip_header_via_get_transport(const belle_sip_header_via_t* via);
+/**
+ * Get lower case version of the transport
+ * @return the lower case version of the transport if from tcp,udp,tls or dtls else, return the value from #belle_sip_header_via_get_transport
+ */
+BELLESIP_EXPORT const char*	belle_sip_header_via_get_transport_lowercase(const belle_sip_header_via_t* via);
+BELLESIP_EXPORT const char*	belle_sip_header_via_get_host(const belle_sip_header_via_t* via);
+BELLESIP_EXPORT int belle_sip_header_via_get_port(const belle_sip_header_via_t* via);
+BELLESIP_EXPORT int belle_sip_header_via_get_listening_port(const belle_sip_header_via_t *via);
+
+BELLESIP_EXPORT const char*	belle_sip_header_via_get_maddr(const belle_sip_header_via_t* via);
+BELLESIP_EXPORT const char*	belle_sip_header_via_get_protocol(const belle_sip_header_via_t* via);
+BELLESIP_EXPORT const char*	belle_sip_header_via_get_received(const belle_sip_header_via_t* via);
+BELLESIP_EXPORT int belle_sip_header_via_get_rport(const belle_sip_header_via_t* via);
+BELLESIP_EXPORT int	belle_sip_header_via_get_ttl(const belle_sip_header_via_t* via);
+
+BELLESIP_EXPORT void belle_sip_header_via_set_branch(belle_sip_header_via_t* via,const char* branch);
+BELLESIP_EXPORT void belle_sip_header_via_set_host(belle_sip_header_via_t* via, const char* host);
+BELLESIP_EXPORT int belle_sip_header_via_set_port(belle_sip_header_via_t* via,int port);
+BELLESIP_EXPORT void belle_sip_header_via_set_maddr(belle_sip_header_via_t* via, const char* maddr);
+BELLESIP_EXPORT void belle_sip_header_via_set_protocol(belle_sip_header_via_t* via, const char* protocol);
+BELLESIP_EXPORT void belle_sip_header_via_set_received(belle_sip_header_via_t* via, const char* received);
+BELLESIP_EXPORT int belle_sip_header_via_set_rport(belle_sip_header_via_t* via,int rport);
+BELLESIP_EXPORT void belle_sip_header_via_set_transport(belle_sip_header_via_t* via,const char* transport);
+BELLESIP_EXPORT int belle_sip_header_via_set_ttl(belle_sip_header_via_t* via, int ttl);
+#define BELLE_SIP_HEADER_VIA(t) BELLE_SIP_CAST(t,belle_sip_header_via_t)
+#define BELLE_SIP_VIA "Via"
+
+/******************************
+ * Call id object inherent from object
+ *
+ ******************************/
+typedef struct _belle_sip_header_call_id belle_sip_header_call_id_t;
+
+BELLESIP_EXPORT belle_sip_header_call_id_t* belle_sip_header_call_id_new(void);
+
+BELLESIP_EXPORT belle_sip_header_call_id_t* belle_sip_header_call_id_parse (const char* call_id) ;
+BELLESIP_EXPORT const char*	belle_sip_header_call_id_get_call_id(const belle_sip_header_call_id_t* call_id);
+BELLESIP_EXPORT void belle_sip_header_call_id_set_call_id(belle_sip_header_call_id_t* call_id,const char* id);
+unsigned int belle_sip_header_call_id_equals(const belle_sip_header_call_id_t* a,const belle_sip_header_call_id_t* b);
+#define BELLE_SIP_HEADER_CALL_ID(t) BELLE_SIP_CAST(t,belle_sip_header_call_id_t)
+#define BELLE_SIP_CALL_ID "Call-ID"
+/******************************
+ * Retry-After object inherent from object
+ *
+ ******************************/
+typedef struct _belle_sip_header_retry_after belle_sip_header_retry_after_t;
+
+BELLESIP_EXPORT belle_sip_header_retry_after_t* belle_sip_header_retry_after_new(void);
+BELLESIP_EXPORT belle_sip_header_retry_after_t* belle_sip_header_retry_after_create (int retry_after);
+BELLESIP_EXPORT belle_sip_header_retry_after_t* belle_sip_header_retry_after_parse (const char *retry_after) ;
+BELLESIP_EXPORT int belle_sip_header_retry_after_get_retry_after(const belle_sip_header_retry_after_t* retry_after);
+BELLESIP_EXPORT void belle_sip_header_retry_after_set_retry_after(belle_sip_header_retry_after_t* retry_after,int second);
+
+#define BELLE_SIP_HEADER_RETRY_AFTER(t) BELLE_SIP_CAST(t,belle_sip_header_retry_after_t)
+#define BELLE_SIP_RETRY_AFTER "Retry-After"
+/******************************
+ * cseq object inherent from object
+ *
+ ******************************/
+typedef struct _belle_sip_header_cseq belle_sip_header_cseq_t;
+
+BELLESIP_EXPORT belle_sip_header_cseq_t* belle_sip_header_cseq_new(void);
+BELLESIP_EXPORT belle_sip_header_cseq_t* belle_sip_header_cseq_create(unsigned int number, const char *method);
+BELLESIP_EXPORT belle_sip_header_cseq_t* belle_sip_header_cseq_parse (const char* cseq) ;
+BELLESIP_EXPORT const char*	belle_sip_header_cseq_get_method(const belle_sip_header_cseq_t* cseq);
+BELLESIP_EXPORT void belle_sip_header_cseq_set_method(belle_sip_header_cseq_t* cseq,const char* method);
+BELLESIP_EXPORT unsigned int	belle_sip_header_cseq_get_seq_number(const belle_sip_header_cseq_t* cseq);
+BELLESIP_EXPORT void belle_sip_header_cseq_set_seq_number(belle_sip_header_cseq_t* cseq,unsigned int seq_number);
+#define BELLE_SIP_HEADER_CSEQ(t) BELLE_SIP_CAST(t,belle_sip_header_cseq_t)
+#define BELLE_SIP_CSEQ "CSeq"
+/******************************
+ * content type object inherent from parameters
+ *
+ ******************************/
+typedef struct _belle_sip_header_content_type belle_sip_header_content_type_t;
+
+BELLESIP_EXPORT belle_sip_header_content_type_t* belle_sip_header_content_type_new(void);
+BELLESIP_EXPORT belle_sip_header_content_type_t* belle_sip_header_content_type_parse (const char* content_type) ;
+BELLESIP_EXPORT belle_sip_header_content_type_t* belle_sip_header_content_type_create (const char* type,const char* sub_type) ;
+
+BELLESIP_EXPORT belle_sip_header_content_type_t* belle_sip_header_content_type_parse (const char* content_type) ;
+BELLESIP_EXPORT const char*	belle_sip_header_content_type_get_type(const belle_sip_header_content_type_t* content_type);
+BELLESIP_EXPORT void belle_sip_header_content_type_set_type(belle_sip_header_content_type_t* content_type,const char* type);
+BELLESIP_EXPORT const char*	belle_sip_header_content_type_get_subtype(const belle_sip_header_content_type_t* content_type);
+BELLESIP_EXPORT void belle_sip_header_content_type_set_subtype(belle_sip_header_content_type_t* content_type,const char* sub_type);
+#define BELLE_SIP_HEADER_CONTENT_TYPE(t) BELLE_SIP_CAST(t,belle_sip_header_content_type_t)
+#define BELLE_SIP_CONTENT_TYPE "Content-Type"
+/******************************
+ *
+ * Expires inherit from header
+ *
+ ******************************/
+typedef struct _belle_sip_header_expires belle_sip_header_expires_t;
+
+BELLESIP_EXPORT belle_sip_header_expires_t* belle_sip_header_expires_new(void);
+
+BELLESIP_EXPORT belle_sip_header_expires_t* belle_sip_header_expires_parse (const char* expires) ;
+BELLESIP_EXPORT int belle_sip_header_expires_get_expires(const belle_sip_header_expires_t* expires);
+BELLESIP_EXPORT void belle_sip_header_expires_set_expires(belle_sip_header_expires_t* expires,int value);
+BELLESIP_EXPORT int belle_sip_header_expires_decrement_expires(belle_sip_header_expires_t* expires);
+BELLESIP_EXPORT belle_sip_header_expires_t* belle_sip_header_expires_create(int expires);
+#define BELLE_SIP_HEADER_EXPIRES(t) BELLE_SIP_CAST(t,belle_sip_header_expires_t)
+#define BELLE_SIP_EXPIRES "Expires"
+/******************************
+ * Route header object inherent from header_address
+ *
+ ******************************/
+typedef struct _belle_sip_header_route belle_sip_header_route_t;
+
+BELLESIP_EXPORT belle_sip_header_route_t* belle_sip_header_route_new(void);
+BELLESIP_EXPORT belle_sip_header_route_t* belle_sip_header_route_parse (const char* route) ;
+BELLESIP_EXPORT belle_sip_header_route_t* belle_sip_header_route_create(const belle_sip_header_address_t* route);
+
+#define BELLE_SIP_HEADER_ROUTE(t) BELLE_SIP_CAST(t,belle_sip_header_route_t)
+#define BELLE_SIP_ROUTE "Route"
+/******************************
+ * Record route header object inherent from header_address
+ *
+ ******************************/
+typedef struct _belle_sip_header_record_route belle_sip_header_record_route_t;
+
+BELLESIP_EXPORT belle_sip_header_record_route_t* belle_sip_header_record_route_new(void);
+BELLESIP_EXPORT belle_sip_header_record_route_t* belle_sip_header_record_route_parse (const char* route);
+BELLESIP_EXPORT belle_sip_header_record_route_t* belle_sip_header_record_route_new_auto_outgoing(void);
+
+BELLESIP_EXPORT unsigned char belle_sip_header_record_route_get_auto_outgoing(const belle_sip_header_record_route_t *a);
+
+
+
+#define BELLE_SIP_HEADER_RECORD_ROUTE(t) BELLE_SIP_CAST(t,belle_sip_header_record_route_t)
+#define BELLE_SIP_RECORD_ROUTE	"Record-route"
+ /******************************
+  * Service route header object inherent from header_address
+  *
+  ******************************/
+  typedef struct _belle_sip_header_service_route belle_sip_header_service_route_t;
+
+  BELLESIP_EXPORT belle_sip_header_service_route_t* belle_sip_header_service_route_new(void);
+  BELLESIP_EXPORT belle_sip_header_service_route_t* belle_sip_header_service_route_parse (const char* route) ;
+
+ #define BELLE_SIP_HEADER_SERVICE_ROUTE(t) BELLE_SIP_CAST(t,belle_sip_header_service_route_t)
+ #define BELLE_SIP_SERVICE_ROUTE	"Service-route"
+ /******************************
+  *
+  * user-Agent header inherit from header
+  *
+  ******************************/
+ typedef struct _belle_sip_header_user_agent belle_sip_header_user_agent_t;
+
+ BELLESIP_EXPORT belle_sip_header_user_agent_t* belle_sip_header_user_agent_new(void);
+
+ BELLESIP_EXPORT belle_sip_header_user_agent_t* belle_sip_header_user_agent_parse (const char* user_agent) ;
+ BELLESIP_EXPORT belle_sip_list_t* belle_sip_header_user_agent_get_products(const belle_sip_header_user_agent_t* user_agent);
+ /**
+  * concatenates products
+  * @param user_agent [in] user agent header
+  * @param value [out]buffer where to put result in
+  * @param value_size [in] size of the buffer
+  * @return number of written characters or -1 inca se of error;
+  */
+ BELLESIP_EXPORT int belle_sip_header_user_agent_get_products_as_string(const belle_sip_header_user_agent_t* user_agent,char* value,unsigned int value_size);
+ BELLESIP_EXPORT void belle_sip_header_user_agent_set_products(belle_sip_header_user_agent_t* user_agent,belle_sip_list_t* value);
+ BELLESIP_EXPORT void belle_sip_header_user_agent_add_product(belle_sip_header_user_agent_t* user_agent,const char* product);
+ #define BELLE_SIP_HEADER_USER_AGENT(t) BELLE_SIP_CAST(t,belle_sip_header_user_agent_t)
+#define BELLE_SIP_USER_AGENT "User-Agent"
+
+ /******************************
+ * Content length inherent from object
+ *
+ ******************************/
+typedef struct _belle_sip_header_content_length belle_sip_header_content_length_t;
+
+BELLESIP_EXPORT belle_sip_header_content_length_t* belle_sip_header_content_length_new(void);
+
+BELLESIP_EXPORT belle_sip_header_content_length_t* belle_sip_header_content_length_parse (const char* content_length) ;
+BELLESIP_EXPORT belle_sip_header_content_length_t* belle_sip_header_content_length_create (size_t content_length) ;
+BELLESIP_EXPORT size_t belle_sip_header_content_length_get_content_length(const belle_sip_header_content_length_t* content_length);
+BELLESIP_EXPORT void belle_sip_header_content_length_set_content_length(belle_sip_header_content_length_t* content_length,size_t length);
+#define BELLE_SIP_HEADER_CONTENT_LENGTH(t) BELLE_SIP_CAST(t,belle_sip_header_content_length_t)
+#define BELLE_SIP_CONTENT_LENGTH "Content-Length"
+
+/******************************
+ * authorization header inherit from parameters
+ *
+ ******************************/
+typedef struct _belle_sip_header_authorization belle_sip_header_authorization_t;
+
+BELLESIP_EXPORT belle_sip_header_authorization_t* belle_sip_header_authorization_new(void);
+BELLESIP_EXPORT belle_sip_header_authorization_t* belle_sip_header_authorization_parse(const char* authorization);
+BELLESIP_EXPORT const char*	belle_sip_header_authorization_get_algorithm(const belle_sip_header_authorization_t* authorization );
+BELLESIP_EXPORT const char*	belle_sip_header_authorization_get_cnonce(const belle_sip_header_authorization_t* authorization );
+BELLESIP_EXPORT const char* belle_sip_header_authorization_get_nonce(const belle_sip_header_authorization_t* authorization);
+/*convert nonce count as string id present
+ * @return 0 in case of success
+ * */
+BELLESIP_EXPORT int belle_sip_header_authorization_get_nonce_count_as_string(const belle_sip_header_authorization_t* authorization,char nounce_count[9]);
+BELLESIP_EXPORT int	belle_sip_header_authorization_get_nonce_count(const belle_sip_header_authorization_t* authorization);
+BELLESIP_EXPORT const char*	belle_sip_header_authorization_get_opaque(const belle_sip_header_authorization_t* authorization);
+BELLESIP_EXPORT const char*	belle_sip_header_authorization_get_qop(const belle_sip_header_authorization_t* authorization);
+BELLESIP_EXPORT const char*	belle_sip_header_authorization_get_realm(const belle_sip_header_authorization_t* authorization);
+BELLESIP_EXPORT const char*	belle_sip_header_authorization_get_response(const belle_sip_header_authorization_t* authorization);
+BELLESIP_EXPORT const char*	belle_sip_header_authorization_get_scheme(const belle_sip_header_authorization_t* authorization);
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_header_authorization_get_uri(const belle_sip_header_authorization_t* authorization);
+BELLESIP_EXPORT const char*	belle_sip_header_authorization_get_username(const belle_sip_header_authorization_t* authorization);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_algorithm(belle_sip_header_authorization_t* authorization, const char* algorithm);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_cnonce(belle_sip_header_authorization_t* authorization, const char* cNonce);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_nonce(belle_sip_header_authorization_t* authorization, const char* nonce);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_nonce_count(belle_sip_header_authorization_t* authorization, int nonceCount);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_opaque(belle_sip_header_authorization_t* authorization, const char* opaque);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_qop(belle_sip_header_authorization_t* authorization, const char* qop);
+BELLESIP_EXPORT void belle_sip_header_authorization_add_qop(belle_sip_header_authorization_t* authorization, const char* qop);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_realm(belle_sip_header_authorization_t* authorization, const char* realm);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_response(belle_sip_header_authorization_t* authorization, const char* response);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_scheme(belle_sip_header_authorization_t* authorization, const char* scheme);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_uri(belle_sip_header_authorization_t* authorization, belle_sip_uri_t* uri);
+BELLESIP_EXPORT void belle_sip_header_authorization_set_username(belle_sip_header_authorization_t* authorization, const char* username);
+
+#define BELLE_SIP_HEADER_AUTHORIZATION(t) BELLE_SIP_CAST(t,belle_sip_header_authorization_t)
+#define BELLE_SIP_AUTHORIZATION "Authorization"
+
+/*******************************
+ * proxy_authorization inherit from Authorization
+ */
+typedef struct _belle_sip_header_proxy_authorization belle_sip_header_proxy_authorization_t;
+BELLESIP_EXPORT belle_sip_header_proxy_authorization_t* belle_sip_header_proxy_authorization_new(void);
+BELLESIP_EXPORT belle_sip_header_proxy_authorization_t* belle_sip_header_proxy_authorization_parse(const char* proxy_authorization);
+#define BELLE_SIP_HEADER_PROXY_AUTHORIZATION(t) BELLE_SIP_CAST(t,belle_sip_header_proxy_authorization_t)
+#define BELLE_SIP_PROXY_AUTHORIZATION "Proxy-Authorization"
+
+/*******************************
+ * http_authorization inherit from Authorization
+ */
+typedef struct _belle_http_header_authorization belle_http_header_authorization_t;
+BELLESIP_EXPORT belle_http_header_authorization_t* belle_http_header_authorization_new(void);
+/*cannot be parsed for now
+BELLESIP_EXPORT belle_http_header_authorization_t* belle_http_header_authorization_parse(const char* proxy_authorization);
+*/
+BELLESIP_EXPORT void belle_http_header_authorization_set_uri(belle_http_header_authorization_t* authorization, belle_generic_uri_t* uri);
+BELLESIP_EXPORT belle_generic_uri_t* belle_http_header_authorization_get_uri(const belle_http_header_authorization_t* authorization);
+#define BELLE_HTTP_HEADER_AUTHORIZATION(t) BELLE_SIP_CAST(t,belle_http_header_authorization_t)
+#define BELLE_HTTP_AUTHORIZATION "Authorization"
+
+
+/*******************************
+ * www_authenticate inherit from parameters
+ */
+typedef struct _belle_sip_header_www_authenticate belle_sip_header_www_authenticate_t;
+BELLESIP_EXPORT belle_sip_header_www_authenticate_t* belle_sip_header_www_authenticate_new(void);
+BELLESIP_EXPORT belle_sip_header_www_authenticate_t* belle_sip_header_www_authenticate_parse(const char* www_authenticate);
+BELLESIP_EXPORT const char*	belle_sip_header_www_authenticate_get_algorithm(const belle_sip_header_www_authenticate_t* www_authenticate );
+BELLESIP_EXPORT const char* belle_sip_header_www_authenticate_get_nonce(const belle_sip_header_www_authenticate_t* www_authenticate);
+BELLESIP_EXPORT const char*	belle_sip_header_www_authenticate_get_opaque(const belle_sip_header_www_authenticate_t* www_authenticate);
+BELLESIP_EXPORT belle_sip_list_t* belle_sip_header_www_authenticate_get_qop(const belle_sip_header_www_authenticate_t* www_authetication);
+BELLESIP_EXPORT const char* belle_sip_header_www_authenticate_get_qop_first(const belle_sip_header_www_authenticate_t* www_authetication);
+BELLESIP_EXPORT const char*	belle_sip_header_www_authenticate_get_realm(const belle_sip_header_www_authenticate_t* www_authenticate);
+BELLESIP_EXPORT const char*	belle_sip_header_www_authenticate_get_scheme(const belle_sip_header_www_authenticate_t* www_authenticate);
+BELLESIP_EXPORT const char*	belle_sip_header_www_authenticate_get_domain(const belle_sip_header_www_authenticate_t* www_authenticate);
+BELLESIP_EXPORT unsigned int belle_sip_header_www_authenticate_is_stale(const belle_sip_header_www_authenticate_t* www_authenticate);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_set_algorithm(belle_sip_header_www_authenticate_t* www_authenticate, const char* algorithm);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_set_nonce(belle_sip_header_www_authenticate_t* www_authenticate, const char* nonce);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_set_opaque(belle_sip_header_www_authenticate_t* www_authenticate, const char* opaque);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_set_qop(belle_sip_header_www_authenticate_t* www_authentication, belle_sip_list_t*  qop);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_add_qop(belle_sip_header_www_authenticate_t* www_authentication, const char*  qop_param);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_set_realm(belle_sip_header_www_authenticate_t* www_authenticate, const char* realm);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_set_scheme(belle_sip_header_www_authenticate_t* www_authenticate, const char* scheme);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_set_domain(belle_sip_header_www_authenticate_t* www_authenticate,const char* domain);
+BELLESIP_EXPORT void belle_sip_header_www_authenticate_set_stale(belle_sip_header_www_authenticate_t* www_authenticate, unsigned int enable);
+#define BELLE_SIP_HEADER_WWW_AUTHENTICATE(t) BELLE_SIP_CAST(t,belle_sip_header_www_authenticate_t)
+#define BELLE_SIP_WWW_AUTHENTICATE "WWW-Authenticate"
+
+/*******************************
+ * proxy_authenticate inherit from www_authenticate
+ */
+typedef struct _belle_sip_header_proxy_authenticate belle_sip_header_proxy_authenticate_t;
+BELLESIP_EXPORT belle_sip_header_proxy_authenticate_t* belle_sip_header_proxy_authenticate_new(void);
+BELLESIP_EXPORT belle_sip_header_proxy_authenticate_t* belle_sip_header_proxy_authenticate_parse(const char* proxy_authenticate);
+#define BELLE_SIP_HEADER_PROXY_AUTHENTICATE(t) BELLE_SIP_CAST(t,belle_sip_header_proxy_authenticate_t)
+#define BELLE_SIP_PROXY_AUTHENTICATE "Proxy-Authenticate"
+
+/******************************
+ *
+ * Max forward inherit from header
+ *
+ ******************************/
+typedef struct _belle_sip_header_max_forwards belle_sip_header_max_forwards_t;
+
+BELLESIP_EXPORT belle_sip_header_max_forwards_t* belle_sip_header_max_forwards_new(void);
+BELLESIP_EXPORT belle_sip_header_max_forwards_t* belle_sip_header_max_forwards_create(int value);
+
+BELLESIP_EXPORT belle_sip_header_max_forwards_t* belle_sip_header_max_forwards_parse (const char* max_forwards) ;
+BELLESIP_EXPORT int belle_sip_header_max_forwards_get_max_forwards(const belle_sip_header_max_forwards_t* max_forwards);
+BELLESIP_EXPORT void belle_sip_header_max_forwards_set_max_forwards(belle_sip_header_max_forwards_t* max_forwards,int value);
+BELLESIP_EXPORT int belle_sip_header_max_forwards_decrement_max_forwards(belle_sip_header_max_forwards_t* max_forwards);
+#define BELLE_SIP_HEADER_MAX_FORWARDS(t) BELLE_SIP_CAST(t,belle_sip_header_max_forwards_t)
+#define BELLE_SIP_MAX_FORWARDS "Max-Forwards"
+
+/******************************
+ *
+ * Subscription state  inherit from parameters
+ *
+ ******************************/
+typedef struct _belle_sip_header_subscription_state belle_sip_header_subscription_state_t;
+
+BELLESIP_EXPORT belle_sip_header_subscription_state_t* belle_sip_header_subscription_state_new(void);
+
+BELLESIP_EXPORT belle_sip_header_subscription_state_t* belle_sip_header_subscription_state_parse (const char* subscription_state) ;
+BELLESIP_EXPORT belle_sip_header_subscription_state_t* belle_sip_header_subscription_state_create (const char* subscription_state,int expires);
+
+BELLESIP_EXPORT const char* belle_sip_header_subscription_state_get_state(const belle_sip_header_subscription_state_t* subscription_state);
+BELLESIP_EXPORT int belle_sip_header_subscription_state_get_expires(const belle_sip_header_subscription_state_t* subscription_state);
+BELLESIP_EXPORT const char* belle_sip_header_subscription_state_get_reason(const belle_sip_header_subscription_state_t* subscription_state);
+BELLESIP_EXPORT int belle_sip_header_subscription_state_get_retry_after(const belle_sip_header_subscription_state_t* subscription_state);
+
+BELLESIP_EXPORT void belle_sip_header_subscription_state_set_state(belle_sip_header_subscription_state_t* subscription_state,const char* state);
+BELLESIP_EXPORT void belle_sip_header_subscription_state_set_expires(belle_sip_header_subscription_state_t* subscription_state,int expire);
+BELLESIP_EXPORT void belle_sip_header_subscription_state_set_reason(belle_sip_header_subscription_state_t* subscription_state, const char* reason);
+BELLESIP_EXPORT void belle_sip_header_subscription_state_set_retry_after(belle_sip_header_subscription_state_t* subscription_state, int retry_after );
+
+
+#define BELLE_SIP_HEADER_SUBSCRIPTION_STATE(t) BELLE_SIP_CAST(t,belle_sip_header_subscription_state_t)
+#define BELLE_SIP_SUBSCRIPTION_STATE "Subscription-State"
+#define BELLE_SIP_SUBSCRIPTION_STATE_ACTIVE  "active"
+#define BELLE_SIP_SUBSCRIPTION_STATE_PENDING "pending"
+#define BELLE_SIP_SUBSCRIPTION_STATE_TERMINATED "terminated"
+
+/******************************
+ * Refer-To header object inherits from header_address
+ *
+ ******************************/
+ typedef struct _belle_sip_header_refer_to belle_sip_header_refer_to_t;
+ BELLESIP_EXPORT belle_sip_header_refer_to_t* belle_sip_header_refer_to_new(void);
+ BELLESIP_EXPORT belle_sip_header_refer_to_t* belle_sip_header_refer_to_parse(const char* refer_to) ;
+ BELLESIP_EXPORT belle_sip_header_refer_to_t* belle_sip_header_refer_to_create(const belle_sip_header_address_t *address);
+#define BELLE_SIP_HEADER_REFER_TO(t) BELLE_SIP_CAST(t,belle_sip_header_refer_to_t)
+#define BELLE_SIP_REFER_TO "Refer-To"
+
+ /******************************
+  * Referred-by header object inherits from header_address
+  *
+  ******************************/
+  typedef struct _belle_sip_header_referred_by belle_sip_header_referred_by_t;
+  BELLESIP_EXPORT belle_sip_header_referred_by_t* belle_sip_header_referred_by_new(void);
+  BELLESIP_EXPORT belle_sip_header_referred_by_t* belle_sip_header_referred_by_parse(const char* referred_by) ;
+  BELLESIP_EXPORT belle_sip_header_referred_by_t* belle_sip_header_referred_by_create(const belle_sip_header_address_t *address);
+ #define BELLE_SIP_HEADER_REFERRED_BY(t) BELLE_SIP_CAST(t,belle_sip_header_referred_by_t)
+ #define BELLE_SIP_REFERRED_BY "Referred-By"
+
+  /******************************
+   * Replace header object inherits from parameters
+   *
+   ******************************/
+typedef struct _belle_sip_header_replaces belle_sip_header_replaces_t;
+BELLESIP_EXPORT belle_sip_header_replaces_t* belle_sip_header_replaces_new(void);
+BELLESIP_EXPORT belle_sip_header_replaces_t* belle_sip_header_replaces_parse(const char* replaces) ;
+
+BELLESIP_EXPORT belle_sip_header_replaces_t* belle_sip_header_replaces_create(const char* call_id,const char* from_tag,const char* to_tag);
+/*
+ * Creates a Eeplaces header from an escaped value that can be found in Referred-by header
+ * @param escaped_replace ex : 12345%40192.168.118.3%3Bto-tag%3D12345%3Bfrom-tag%3D5FFE-3994
+ * @return a newly allocated Replace header
+ * */
+BELLESIP_EXPORT belle_sip_header_replaces_t* belle_sip_header_replaces_create2(const char* escaped_replace);
+BELLESIP_EXPORT const char* belle_sip_header_replaces_get_call_id(const belle_sip_header_replaces_t* obj);
+BELLESIP_EXPORT const char* belle_sip_header_replaces_get_from_tag(const belle_sip_header_replaces_t* obj);
+BELLESIP_EXPORT const char* belle_sip_header_replaces_get_to_tag(const belle_sip_header_replaces_t* obj);
+BELLESIP_EXPORT void belle_sip_header_replaces_set_call_id(belle_sip_header_replaces_t* obj, const char* callid);
+BELLESIP_EXPORT void belle_sip_header_replaces_set_from_tag(belle_sip_header_replaces_t* obj,const char* from_tag);
+BELLESIP_EXPORT void belle_sip_header_replaces_set_to_tag(belle_sip_header_replaces_t* obj,const char* to_tag);
+/*return a newly allocated string with the content of the header value in escaped form.
+ * <br> Purpose of this function is to be used to set Refer-To uri header Replaces
+ * @param obj Replaces object
+ * @return newly allocated string ex: 12345%40192.168.118.3%3Bto-tag%3D12345%3Bfrom-tag%3D5FFE-3994*/
+BELLESIP_EXPORT char* belle_sip_header_replaces_value_to_escaped_string(const belle_sip_header_replaces_t* obj);
+#define BELLE_SIP_HEADER_REPLACES(t) BELLE_SIP_CAST(t,belle_sip_header_replaces_t)
+#define BELLE_SIP_REPLACES "Replaces"
+
+/*******
+ * Date header
+ *******/
+
+typedef struct belle_sip_header_date belle_sip_header_date_t;
+
+BELLESIP_EXPORT belle_sip_header_date_t* belle_sip_header_date_new(void);
+BELLESIP_EXPORT belle_sip_header_date_t* belle_sip_header_date_parse(const char* date) ;
+
+BELLESIP_EXPORT belle_sip_header_date_t* belle_sip_header_date_create_from_time(const time_t *utc_time);
+
+BELLESIP_EXPORT time_t belle_sip_header_date_get_time(belle_sip_header_date_t *obj);
+
+BELLESIP_EXPORT void belle_sip_header_date_set_time(belle_sip_header_date_t *obj, const time_t *utc_time);
+
+BELLESIP_EXPORT const char * belle_sip_header_date_get_date(const belle_sip_header_date_t *obj);
+
+BELLESIP_EXPORT void belle_sip_header_date_set_date(belle_sip_header_date_t *obj, const char *date);
+
+#define BELLE_SIP_HEADER_DATE(obj)	BELLE_SIP_CAST(obj,belle_sip_header_date_t)
+#define BELLE_SIP_DATE "Date"
+
+/******************************
+* P-Preferred-Identity header object inherent from header_address
+*
+******************************/
+typedef struct _belle_sip_header_p_preferred_identity belle_sip_header_p_preferred_identity_t;
+
+BELLESIP_EXPORT belle_sip_header_p_preferred_identity_t* belle_sip_header_p_preferred_identity_new(void);
+
+BELLESIP_EXPORT belle_sip_header_p_preferred_identity_t* belle_sip_header_p_preferred_identity_parse(const char* p_preferred_identity) ;
+
+BELLESIP_EXPORT belle_sip_header_p_preferred_identity_t* belle_sip_header_p_preferred_identity_create(const belle_sip_header_address_t *address);
+
+#define BELLE_SIP_HEADER_P_PREFERRED_IDENTITY(t) BELLE_SIP_CAST(t,belle_sip_header_p_preferred_identity_t)
+#define BELLE_SIP_P_PREFERRED_IDENTITY "P-Preferred-Identity"
+
+/******************************
+* Privacy header object inherent from header
+*
+******************************/
+typedef struct _belle_sip_header_privacy belle_sip_header_privacy_t;
+
+BELLESIP_EXPORT belle_sip_header_privacy_t* belle_sip_header_privacy_new(void);
+
+BELLESIP_EXPORT belle_sip_header_privacy_t* belle_sip_header_privacy_parse(const char* privacy) ;
+
+BELLESIP_EXPORT belle_sip_header_privacy_t* belle_sip_header_privacy_create(const char* privacy);
+
+BELLESIP_EXPORT void belle_sip_header_privacy_add_privacy(belle_sip_header_privacy_t* privacy, const char* value);
+
+BELLESIP_EXPORT void belle_sip_header_privacy_set_privacy(belle_sip_header_privacy_t* privacy, belle_sip_list_t* privacy_values);
+
+BELLESIP_EXPORT belle_sip_list_t* belle_sip_header_privacy_get_privacy(const belle_sip_header_privacy_t* privacy);
+
+
+#define BELLE_SIP_HEADER_PRIVACY(t) BELLE_SIP_CAST(t,belle_sip_header_privacy_t)
+#define BELLE_SIP_PRIVACY "Privacy"
+
+
+/******************************
+* Event header object inherent from parameters
+*
+******************************/
+typedef struct _belle_sip_header_event belle_sip_header_event_t;
+BELLESIP_EXPORT belle_sip_header_event_t* belle_sip_header_event_new(void);
+BELLESIP_EXPORT belle_sip_header_event_t* belle_sip_header_event_parse(const char* event) ;
+BELLESIP_EXPORT belle_sip_header_event_t* belle_sip_header_event_create(const char* event);
+BELLESIP_EXPORT const char* belle_sip_header_event_get_package_name(const belle_sip_header_event_t* event);
+BELLESIP_EXPORT void belle_sip_header_event_set_package_name(belle_sip_header_event_t* event, const char* package_name);
+BELLESIP_EXPORT const char* belle_sip_header_event_get_id(const belle_sip_header_event_t* event);
+BELLESIP_EXPORT void belle_sip_header_event_set_id(belle_sip_header_event_t* event, const char* id);
+#define BELLE_SIP_HEADER_EVENT(t) BELLE_SIP_CAST(t,belle_sip_header_event_t)
+#define BELLE_SIP_EVENT "Event"
+
+
+/******************************
+ * Supported header object inherent from header
+ *
+ ******************************/
+typedef struct _belle_sip_header_supported belle_sip_header_supported_t;
+BELLESIP_EXPORT belle_sip_header_supported_t* belle_sip_header_supported_new(void);
+BELLESIP_EXPORT belle_sip_header_supported_t* belle_sip_header_supported_parse(const char* supported) ;
+BELLESIP_EXPORT belle_sip_header_supported_t* belle_sip_header_supported_create(const char* supported);
+BELLESIP_EXPORT void belle_sip_header_supported_add_supported(belle_sip_header_supported_t* supported, const char* value);
+BELLESIP_EXPORT void belle_sip_header_supported_set_supported(belle_sip_header_supported_t* supported, belle_sip_list_t* supported_values);
+BELLESIP_EXPORT belle_sip_list_t* belle_sip_header_supported_get_supported(const belle_sip_header_supported_t* supported);
+#define BELLE_SIP_HEADER_SUPPORTED(t) BELLE_SIP_CAST(t,belle_sip_header_supported_t)
+#define BELLE_SIP_SUPPORTED "Supported"
+
+/******************************
+* Require header object inherent from header
+*
+******************************/
+typedef struct _belle_sip_header_require belle_sip_header_require_t;
+BELLESIP_EXPORT belle_sip_header_require_t* belle_sip_header_require_new(void);
+BELLESIP_EXPORT belle_sip_header_require_t* belle_sip_header_require_parse(const char* require) ;
+BELLESIP_EXPORT belle_sip_header_require_t* belle_sip_header_require_create(const char* require);
+BELLESIP_EXPORT void belle_sip_header_require_add_require(belle_sip_header_require_t* require, const char* value);
+BELLESIP_EXPORT void belle_sip_header_require_set_require(belle_sip_header_require_t* require, belle_sip_list_t* require_values);
+BELLESIP_EXPORT belle_sip_list_t* belle_sip_header_require_get_require(const belle_sip_header_require_t* require);
+#define BELLE_SIP_HEADER_REQUIRE(t) BELLE_SIP_CAST(t,belle_sip_header_require_t)
+#define BELLE_SIP_REQUIRE "Require"
+
+/******************************
+ * Content Disposition header object inherent from header
+ *
+ ******************************/
+typedef struct _belle_sip_header_content_disposition belle_sip_header_content_disposition_t;
+BELLESIP_EXPORT belle_sip_header_content_disposition_t* belle_sip_header_content_disposition_new(void);
+BELLESIP_EXPORT belle_sip_header_content_disposition_t* belle_sip_header_content_disposition_parse (const char* content_disposition) ;
+BELLESIP_EXPORT belle_sip_header_content_disposition_t* belle_sip_header_content_disposition_create (const char* content_disposition);
+BELLESIP_EXPORT const char* belle_sip_header_content_disposition_get_content_disposition(const belle_sip_header_content_disposition_t* content_disposition);
+BELLESIP_EXPORT void belle_sip_header_content_disposition_set_content_disposition(belle_sip_header_content_disposition_t* obj,const char* content_disposition);
+#define BELLE_SIP_HEADER_CONTENT_DISPOSITION(t) BELLE_SIP_CAST(t,belle_sip_header_content_disposition_t)
+#define BELLE_SIP_CONTENT_DISPOSITION "Content-Disposition"
+
+/******************************
+ * Accept header object inherent from parameters
+ *
+ ******************************/
+typedef struct _belle_sip_header_accept belle_sip_header_accept_t;
+BELLESIP_EXPORT belle_sip_header_accept_t* belle_sip_header_accept_new(void);
+BELLESIP_EXPORT belle_sip_header_accept_t* belle_sip_header_accept_parse (const char* accept) ;
+BELLESIP_EXPORT belle_sip_header_accept_t* belle_sip_header_accept_create (const char* type,const char* sub_type) ;
+BELLESIP_EXPORT belle_sip_header_accept_t* belle_sip_header_accept_parse (const char* accept) ;
+BELLESIP_EXPORT const char*	belle_sip_header_accept_get_type(const belle_sip_header_accept_t* accept);
+BELLESIP_EXPORT void belle_sip_header_accept_set_type(belle_sip_header_accept_t* accept,const char* type);
+BELLESIP_EXPORT const char*	belle_sip_header_accept_get_subtype(const belle_sip_header_accept_t* accept);
+BELLESIP_EXPORT void belle_sip_header_accept_set_subtype(belle_sip_header_accept_t* accept,const char* sub_type);
+#define BELLE_SIP_HEADER_ACCEPT(t) BELLE_SIP_CAST(t,belle_sip_header_accept_t)
+#define BELLE_SIP_ACCEPT "Accept"
+
+/******************************
+ * Reason header object inherent from parameters
+ *
+ ******************************/
+typedef struct _belle_sip_header_reason belle_sip_header_reason_t;
+BELLESIP_EXPORT belle_sip_header_reason_t* belle_sip_header_reason_new(void);
+BELLESIP_EXPORT belle_sip_header_reason_t* belle_sip_header_reason_parse (const char* reason) ;
+BELLESIP_EXPORT const char*	belle_sip_header_reason_get_protocol(const belle_sip_header_reason_t* reason);
+BELLESIP_EXPORT void belle_sip_header_reason_set_protocol(belle_sip_header_reason_t* reason,const char* protocol);
+BELLESIP_EXPORT int	belle_sip_header_reason_get_cause(const belle_sip_header_reason_t* reason);
+BELLESIP_EXPORT void belle_sip_header_reason_set_cause(belle_sip_header_reason_t* reason,int cause);
+BELLESIP_EXPORT void belle_sip_header_reason_set_text(belle_sip_header_reason_t* reason,const char* text);
+BELLESIP_EXPORT const char*	belle_sip_header_reason_get_text(const belle_sip_header_reason_t* reason);
+
+#define BELLE_SIP_HEADER_REASON(t) BELLE_SIP_CAST(t,belle_sip_header_reason_t)
+#define BELLE_SIP_REASON "Reason"
+
+
+/******************************
+ * Authentication-Info header inherit from header
+ *
+ ******************************/
+typedef struct _belle_sip_header_authentication_info belle_sip_header_authentication_info_t;
+
+BELLESIP_EXPORT belle_sip_header_authentication_info_t* belle_sip_header_authentication_info_new(void);
+BELLESIP_EXPORT belle_sip_header_authentication_info_t* belle_sip_header_authentication_info_parse(const char* authentication_info );
+BELLESIP_EXPORT const char*	belle_sip_header_authentication_info_get_next_nonce(const belle_sip_header_authentication_info_t* authentication_info );
+BELLESIP_EXPORT void belle_sip_header_authentication_info_set_next_nonce(belle_sip_header_authentication_info_t* authentication_info, const char* next_nonce);
+
+/*limited to a sinle value*/
+BELLESIP_EXPORT const char*	belle_sip_header_authentication_info_get_qop(const belle_sip_header_authentication_info_t* authentication_info);
+BELLESIP_EXPORT void belle_sip_header_authentication_info_set_qop(belle_sip_header_authentication_info_t* authentication_info, const char* qop);
+
+BELLESIP_EXPORT const char*	belle_sip_header_authentication_info_get_rsp_auth(const belle_sip_header_authentication_info_t* rsp_auth);
+BELLESIP_EXPORT void belle_sip_header_authentication_info_set_rsp_auth(belle_sip_header_authentication_info_t* authentication_info, const char* rsp_auth);
+
+BELLESIP_EXPORT const char* belle_sip_header_authentication_info_get_cnonce(const belle_sip_header_authentication_info_t* authentication_info);
+BELLESIP_EXPORT void belle_sip_header_authentication_info_set_cnonce(belle_sip_header_authentication_info_t* authentication_info, const char* cNonce);
+
+BELLESIP_EXPORT void belle_sip_header_authentication_info_set_nonce_count(belle_sip_header_authentication_info_t* authentication_info, int nonceCount);
+BELLESIP_EXPORT int	belle_sip_header_authentication_info_get_nonce_count(const belle_sip_header_authentication_info_t* authentication_info);
+
+
+#define BELLE_SIP_HEADER_AUTHENTICATION_INFO(t) BELLE_SIP_CAST(t,belle_sip_header_authentication_info_t)
+#define BELLE_SIP_AUTHENTICATION_INFO "Authentication-Info"
+
+BELLE_SIP_END_DECLS
+
+
+#endif /* HEADERS_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-listener.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-listener.h"
new file mode 100755
index 0000000..8ddb0a5
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-listener.h"
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_http_listener_h
+#define belle_http_listener_h
+
+struct belle_http_response_event{
+	belle_sip_object_t *source;
+	belle_http_request_t *request;
+	belle_http_response_t *response;
+};
+
+typedef struct belle_http_response_event belle_http_response_event_t;
+
+
+#define BELLE_HTTP_INTERFACE_FUNCS(argT) \
+	void (*process_response_headers)(argT *user_ctx, const belle_http_response_event_t *event); \
+	void (*process_response)(argT *user_ctx, const belle_http_response_event_t *event); \
+	void (*process_io_error)(argT *user_ctx, const belle_sip_io_error_event_t *event); \
+	void (*process_timeout)(argT *user_ctx, const belle_sip_timeout_event_t *event); \
+	void (*process_auth_requested)(argT *user_ctx, belle_sip_auth_event_t *event);
+
+BELLE_SIP_DECLARE_INTERFACE_BEGIN(belle_http_request_listener_t)
+	BELLE_HTTP_INTERFACE_FUNCS(belle_http_request_listener_t)
+BELLE_SIP_DECLARE_INTERFACE_END
+
+struct belle_http_request_listener_callbacks{
+	BELLE_HTTP_INTERFACE_FUNCS(void)
+	void (*listener_destroyed)(void *user_ctx);
+};
+
+typedef struct belle_http_request_listener_callbacks belle_http_request_listener_callbacks_t;
+
+#define BELLE_HTTP_REQUEST_LISTENER(obj) BELLE_SIP_INTERFACE_CAST(obj,belle_http_request_listener_t)
+
+BELLE_SIP_BEGIN_DECLS
+/**
+ * Creates an object implementing the belle_http_request_listener_t interface.
+ * This object passes the events to the callbacks, providing also the user context.
+**/
+BELLESIP_EXPORT belle_http_request_listener_t *belle_http_request_listener_create_from_callbacks(const belle_http_request_listener_callbacks_t *callbacks, void *user_ctx);
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-message.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-message.h"
new file mode 100755
index 0000000..c73e09b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-message.h"
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_HTTP_MESSAGE_H
+#define BELLE_HTTP_MESSAGE_H
+
+#include "belle-sip/generic-uri.h"
+
+#define BELLE_HTTP_REQUEST(obj)		BELLE_SIP_CAST(obj,belle_http_request_t)
+#define BELLE_HTTP_RESPONSE(obj)	BELLE_SIP_CAST(obj,belle_http_response_t)
+
+BELLE_SIP_BEGIN_DECLS
+
+/**
+ * Create an http request.
+ * @param method
+ * @param uri the http uri
+ * @param ... optional list of belle_sip_header_t* to be included in the request, ending with NULL.
+ */
+BELLESIP_EXPORT belle_http_request_t *belle_http_request_create(const char *method, belle_generic_uri_t *uri, ...);
+BELLESIP_EXPORT belle_http_request_t* belle_http_request_new(void);
+BELLESIP_EXPORT belle_http_request_t* belle_http_request_parse(const char* raw);
+
+BELLESIP_EXPORT int belle_http_request_is_cancelled(const belle_http_request_t *req);
+BELLESIP_EXPORT void belle_http_request_cancel(belle_http_request_t *req);
+
+BELLESIP_EXPORT belle_generic_uri_t* belle_http_request_get_uri(const belle_http_request_t* request);
+BELLESIP_EXPORT void belle_http_request_set_uri(belle_http_request_t* request, belle_generic_uri_t* uri);
+BELLESIP_EXPORT const char* belle_http_request_get_method(const belle_http_request_t* request);
+BELLESIP_EXPORT void belle_http_request_set_method(belle_http_request_t* request,const char* method);
+
+ BELLESIP_EXPORT belle_http_response_t *belle_http_request_get_response(belle_http_request_t *req);
+
+/**
+ * http response
+ * */
+BELLESIP_EXPORT int belle_http_response_get_status_code(const belle_http_response_t *response);
+BELLESIP_EXPORT void belle_http_response_set_status_code(belle_http_response_t *response,int status);
+
+BELLESIP_EXPORT const char* belle_http_response_get_reason_phrase(const belle_http_response_t *response);
+BELLESIP_EXPORT void belle_http_response_set_reason_phrase(belle_http_response_t *response,const char* reason_phrase);
+
+
+BELLESIP_EXPORT belle_http_response_t *belle_http_response_new(void);
+
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-provider.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-provider.h"
new file mode 100755
index 0000000..80d8757
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/http-provider.h"
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_sip_http_provider_h
+#define belle_sip_http_provider_h
+
+BELLE_SIP_BEGIN_DECLS
+
+#define BELLE_SIP_HTTP_PROVIDER(obj)	BELLE_SIP_CAST(obj,belle_http_provider_t)
+/**
+ * Set the certificate verify policy for the TLS connection
+ * @return 0 on succes
+ * @deprecated Use belle_http_provider_set_tls_crypto_config() instead
+ */
+BELLESIP_DEPRECATED BELLESIP_EXPORT int belle_http_provider_set_tls_verify_policy(belle_http_provider_t *obj, belle_tls_verify_policy_t *verify_ctx);
+
+/**
+ * Set the certificate crypto configuration used by this TLS connection
+ * @return 0 on succes
+ */
+BELLESIP_EXPORT int belle_http_provider_set_tls_crypto_config(belle_http_provider_t *obj, belle_tls_crypto_config_t *crypto_config);
+
+/**
+ * Can be used to simulate network recv error, for tests.
+ * @param obj
+ * @param recv_error if <=0, will cause channel error to be reported
+**/
+BELLESIP_EXPORT void belle_http_provider_set_recv_error(belle_http_provider_t *obj, int recv_error);
+
+BELLESIP_EXPORT int belle_http_provider_send_request(belle_http_provider_t *obj, belle_http_request_t *req, belle_http_request_listener_t *listener);
+
+BELLESIP_EXPORT void belle_http_provider_cancel_request(belle_http_provider_t *obj, belle_http_request_t *req);
+
+BELLESIP_EXPORT belle_sip_list_t** belle_http_provider_get_channels(belle_http_provider_t *obj, const char *transport_name);
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/list.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/list.h"
new file mode 100755
index 0000000..d4fd818
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/list.h"
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_LIST_H_
+#define BELLE_SIP_LIST_H_
+
+#include "bctoolbox/list.h"
+
+typedef struct _bctbx_list belle_sip_list_t;
+
+#define belle_sip_list_new bctbx_list_new
+#define belle_sip_list_append bctbx_list_append
+#define belle_sip_list_prepend  bctbx_list_prepend
+#define belle_sip_list_prepend_link bctbx_list_prepend_link
+#define belle_sip_list_last_elem bctbx_list_last_elem
+#define belle_sip_list_free bctbx_list_free
+#define belle_sip_list_concat bctbx_list_concat
+#define belle_sip_list_remove bctbx_list_remove
+#define belle_sip_list_pop_front bctbx_list_pop_front
+#define belle_sip_list_size bctbx_list_size
+#define belle_sip_list_for_each bctbx_list_for_each
+#define belle_sip_list_for_each2 bctbx_list_for_each2
+#define belle_sip_list_remove_link bctbx_list_unlink
+#define belle_sip_list_delete_link bctbx_list_erase_link
+#define belle_sip_list_find bctbx_list_find
+#define belle_sip_list_free bctbx_list_free
+#define belle_sip_list_free_with_data bctbx_list_free_with_data
+#define belle_sip_list_delete_custom bctbx_list_delete_custom
+#define belle_sip_list_first_elem bctbx_list_first_elem
+
+#define belle_sip_compare_func bctbx_compare_func
+#define belle_sip_list_find_custom bctbx_list_find_custom
+#define belle_sip_list_nth_data bctbx_list_nth_data
+#define belle_sip_list_position bctbx_list_position
+#define belle_sip_list_index bctbx_list_index
+#define belle_sip_list_insert_sorted bctbx_list_insert_sorted
+#define belle_sip_list_insert bctbx_list_insert
+#define belle_sip_list_copy bctbx_list_copy
+#define belle_sip_list_copy_with_data bctbx_list_copy_with_data
+#define belle_sip_list_copy_reverse_with_data bctbx_list_copy_reverse_with_data
+
+#endif /* BELLE_SIP_LIST_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/listener.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/listener.h"
new file mode 100755
index 0000000..3f332f5
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/listener.h"
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_sip_listener_h
+#define belle_sip_listener_h
+
+BELLE_SIP_BEGIN_DECLS
+
+typedef struct belle_sip_dialog_terminated_event belle_sip_dialog_terminated_event_t;
+typedef struct belle_sip_io_error_event belle_sip_io_error_event_t;
+typedef struct belle_sip_request_event belle_sip_request_event_t;
+typedef struct belle_sip_response_event belle_sip_response_event_t;
+typedef struct belle_sip_timeout_event belle_sip_timeout_event_t;
+typedef struct belle_sip_transaction_terminated_event belle_sip_transaction_terminated_event_t;
+typedef struct belle_sip_auth_event belle_sip_auth_event_t;
+typedef struct belle_sip_certificates_chain belle_sip_certificates_chain_t;
+typedef struct belle_sip_signing_key belle_sip_signing_key_t;
+
+
+BELLE_SIP_DECLARE_INTERFACE_BEGIN(belle_sip_listener_t)
+	void (*process_dialog_terminated)(belle_sip_listener_t *user_ctx, const belle_sip_dialog_terminated_event_t *event);
+	void (*process_io_error)(belle_sip_listener_t *user_ctx, const belle_sip_io_error_event_t *event);
+	void (*process_request_event)(belle_sip_listener_t *user_ctx, const belle_sip_request_event_t *event);
+	void (*process_response_event)(belle_sip_listener_t *user_ctx, const belle_sip_response_event_t *event);
+	void (*process_timeout)(belle_sip_listener_t *user_ctx, const belle_sip_timeout_event_t *event);
+	void (*process_transaction_terminated)(belle_sip_listener_t *user_ctx, const belle_sip_transaction_terminated_event_t *event);
+	void (*process_auth_requested)(belle_sip_listener_t *user_ctx, belle_sip_auth_event_t *event);
+BELLE_SIP_DECLARE_INTERFACE_END
+
+#define BELLE_SIP_LISTENER(obj) BELLE_SIP_INTERFACE_CAST(obj,belle_sip_listener_t)
+
+/*Response event*/
+BELLESIP_EXPORT belle_sip_response_t* belle_sip_response_event_get_response(const belle_sip_response_event_t* event);
+BELLESIP_EXPORT belle_sip_client_transaction_t *belle_sip_response_event_get_client_transaction(const belle_sip_response_event_t* event);
+BELLESIP_EXPORT belle_sip_dialog_t *belle_sip_response_event_get_dialog(const belle_sip_response_event_t* event);
+
+/*Request event*/
+BELLESIP_EXPORT belle_sip_request_t* belle_sip_request_event_get_request(const belle_sip_request_event_t* event);
+BELLESIP_EXPORT belle_sip_server_transaction_t *belle_sip_request_event_get_server_transaction(const belle_sip_request_event_t* event);
+BELLESIP_EXPORT belle_sip_dialog_t *belle_sip_request_event_get_dialog(const belle_sip_request_event_t* event);
+
+/*Dialog terminated event*/
+BELLESIP_EXPORT belle_sip_dialog_t* belle_sip_dialog_terminated_event_get_dialog(const belle_sip_dialog_terminated_event_t *event);
+BELLESIP_EXPORT int belle_sip_dialog_terminated_event_is_expired(const belle_sip_dialog_terminated_event_t *event);
+
+/**
+ * Timeout Event
+ */
+BELLESIP_EXPORT belle_sip_client_transaction_t *belle_sip_timeout_event_get_client_transaction(const belle_sip_timeout_event_t* event);
+belle_sip_server_transaction_t *belle_sip_timeout_event_get_server_transaction(const belle_sip_timeout_event_t* event);
+
+/**
+ * Transaction Termonated Event
+ */
+BELLESIP_EXPORT belle_sip_client_transaction_t *belle_sip_transaction_terminated_event_get_client_transaction(const belle_sip_transaction_terminated_event_t* event);
+BELLESIP_EXPORT belle_sip_server_transaction_t *belle_sip_transaction_terminated_event_get_server_transaction(const belle_sip_transaction_terminated_event_t* event);
+
+
+/**
+ * auth event mode
+ * */
+typedef enum belle_sip_auth_mode {
+	BELLE_SIP_AUTH_MODE_HTTP_DIGEST, /** Digest authentication has been requested by the server*/
+	BELLE_SIP_AUTH_MODE_TLS /** Client certificate has been requested by the server*/
+} belle_sip_auth_mode_t;
+
+BELLESIP_EXPORT void belle_sip_auth_event_destroy(belle_sip_auth_event_t* event);
+BELLESIP_EXPORT const char* belle_sip_auth_event_get_username(const belle_sip_auth_event_t* event);
+BELLESIP_EXPORT void belle_sip_auth_event_set_username(belle_sip_auth_event_t* event, const char* value);
+
+BELLESIP_EXPORT const char* belle_sip_auth_event_get_userid(const belle_sip_auth_event_t* event);
+BELLESIP_EXPORT void belle_sip_auth_event_set_userid(belle_sip_auth_event_t* event, const char* value);
+
+BELLESIP_EXPORT const char* belle_sip_auth_event_get_realm(const belle_sip_auth_event_t* event);
+BELLESIP_EXPORT void belle_sip_auth_event_set_realm(belle_sip_auth_event_t* event, const char* value);
+
+BELLESIP_EXPORT const char* belle_sip_auth_event_get_algorithm(const belle_sip_auth_event_t* event);
+BELLESIP_EXPORT void belle_sip_auth_event_set_algorithm(belle_sip_auth_event_t* event, const char* value);
+
+BELLESIP_EXPORT const char* belle_sip_auth_event_get_domain(const belle_sip_auth_event_t* event);
+BELLESIP_EXPORT void belle_sip_auth_event_set_domain(belle_sip_auth_event_t* event, const char* value);
+
+BELLESIP_EXPORT const char* belle_sip_auth_event_get_passwd(const belle_sip_auth_event_t* event);
+BELLESIP_EXPORT void belle_sip_auth_event_set_passwd(belle_sip_auth_event_t* event, const char* value);
+
+BELLESIP_EXPORT const char* belle_sip_auth_event_get_ha1(const belle_sip_auth_event_t* event);
+BELLESIP_EXPORT void belle_sip_auth_event_set_ha1(belle_sip_auth_event_t* event, const char* value);
+
+/**
+ * get the authentication mode requested by the server, can be either TLS client certificates of http digest
+ * @param event
+ * @return  belle_sip_auth_mode_t
+ * */
+BELLESIP_EXPORT belle_sip_auth_mode_t belle_sip_auth_event_get_mode(const belle_sip_auth_event_t* event);
+
+
+/**
+ * In case of TLS auth, get value of the distinguished name sent by the server
+ * @param event
+ * @return DN has sent by the server
+ *
+ */
+BELLESIP_EXPORT const char* belle_sip_auth_event_get_distinguished_name(const belle_sip_auth_event_t* event);
+/**
+ * get client certificate
+ * @return  belle_sip_certificate_t*
+ * */
+BELLESIP_EXPORT belle_sip_certificates_chain_t* belle_sip_auth_event_get_client_certificates_chain(const belle_sip_auth_event_t* event);
+/**
+ * set client certificate to be sent in answer to the certificate request issued by the server for the DN belle_sip_auth_event_get_distinguished_name() name
+ * @return  belle_sip_certificate_t*
+ * */
+BELLESIP_EXPORT void belle_sip_auth_event_set_client_certificates_chain(belle_sip_auth_event_t* event, belle_sip_certificates_chain_t* value);
+/**
+ * get client certificate private key
+ * @return  belle_sip_signing_key_t*
+ * */
+BELLESIP_EXPORT belle_sip_signing_key_t* belle_sip_auth_event_get_signing_key(const belle_sip_auth_event_t* event);
+/**
+ * set the private key attached to the client certificate.
+ * @param event belle_sip_auth_event_t
+ * @param value belle_sip_signing_key_t signing key
+ * */
+BELLESIP_EXPORT void belle_sip_auth_event_set_signing_key(belle_sip_auth_event_t* event, belle_sip_signing_key_t* value);
+
+
+/*Io error event*/
+/*
+ * Give access to the remote host
+ * @param event object
+ * @return host value the socket is pointing to
+ * */
+const char* belle_sip_io_error_event_get_host(const belle_sip_io_error_event_t* event);
+/*
+ * Give access to the used transport
+ * @param event object
+ * @return host value the socket is pointing to
+ * */
+const char* belle_sip_io_error_event_get_transport(const belle_sip_io_error_event_t* event);
+/*
+ * Give access to the remote port
+ * @param event object
+ * @return port value the socket is pointing to
+ * */
+unsigned int belle_sip_io_error_event_port(const belle_sip_io_error_event_t* event);
+
+/*
+ * Get access to the object involved in this error, can be either belle_sip_dialog_t or belle_sip_transaction_t or belle_sip_provider_t
+ * @param event
+ * @return belle_sip_object_t source, use belle_sip_object_is_instance_of to check returns type
+ * */
+
+BELLESIP_EXPORT belle_sip_object_t* belle_sip_io_error_event_get_source(const belle_sip_io_error_event_t* event);
+
+
+struct belle_sip_listener_callbacks{
+	void (*process_dialog_terminated)(void *user_ctx, const belle_sip_dialog_terminated_event_t *event);
+	void (*process_io_error)(void *user_ctx, const belle_sip_io_error_event_t *event);
+	void (*process_request_event)(void *user_ctx, const belle_sip_request_event_t *event);
+	void (*process_response_event)(void *user_ctx, const belle_sip_response_event_t *event);
+	void (*process_timeout)(void *user_ctx, const belle_sip_timeout_event_t *event);
+	void (*process_transaction_terminated)(void *user_ctx, const belle_sip_transaction_terminated_event_t *event);
+	void (*process_auth_requested)(void *user_ctx, belle_sip_auth_event_t *auth_event);
+	void (*listener_destroyed)(void *user_ctx);
+};
+
+typedef struct belle_sip_listener_callbacks belle_sip_listener_callbacks_t;
+
+/**
+ * Creates an object implementing the belle_sip_listener_t interface.
+ * This object passes the events to the callbacks, providing also the user context.
+**/
+BELLESIP_EXPORT belle_sip_listener_t *belle_sip_listener_create_from_callbacks(const belle_sip_listener_callbacks_t *callbacks, void *user_ctx);
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/listeningpoint.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/listeningpoint.h"
new file mode 100755
index 0000000..5208eaa
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/listeningpoint.h"
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_TRANSPORT_H
+#define BELLE_SIP_TRANSPORT_H
+
+BELLE_SIP_BEGIN_DECLS
+
+/*This is passed as port information to listening point URIs and means that it shall use a random port.*/
+#define BELLE_SIP_LISTENING_POINT_RANDOM_PORT (-1)
+/*This is passed as port information to listening point URIs and means that it shall not bind.*/
+#define BELLE_SIP_LISTENING_POINT_DONT_BIND (-2)
+
+BELLESIP_EXPORT const char *belle_sip_listening_point_get_ip_address(const belle_sip_listening_point_t *lp);
+BELLESIP_EXPORT int belle_sip_listening_point_get_port(const belle_sip_listening_point_t *lp);
+BELLESIP_EXPORT const char *belle_sip_listening_point_get_transport(const belle_sip_listening_point_t *lp);
+BELLESIP_EXPORT const char *belle_sip_listening_point_get_ip_address(const  belle_sip_listening_point_t *lp);
+/*
+ * set keep alive frequency in ms
+ * @param lp object
+ * @param ms keep alive period in ms. Values <=0 disable keep alive
+ * */
+BELLESIP_EXPORT void belle_sip_listening_point_set_keep_alive(belle_sip_listening_point_t *lp, int ms);
+/*
+ * sends a keep alive right away
+ * @param lp object
+ * */
+BELLESIP_EXPORT void belle_sip_listening_point_send_keep_alive(belle_sip_listening_point_t *lp);
+
+/*
+ * get keep alive frequency in ms
+ * @param lp object
+ * @return  keep alive period in ms. Values <=0 disable keep alive
+ * */
+BELLESIP_EXPORT int belle_sip_listening_point_get_keep_alive(const belle_sip_listening_point_t *lp);
+
+
+
+/**
+ * get the listening information as an URI
+ * @return IP/port/transport as an URI
+ */
+BELLESIP_EXPORT const belle_sip_uri_t* belle_sip_listening_point_get_uri(const  belle_sip_listening_point_t *ip);
+BELLESIP_EXPORT int belle_sip_listening_point_is_reliable(const belle_sip_listening_point_t *lp);
+/**
+ * Clean (close) all channels (connection) managed by this listening point.
+**/
+BELLESIP_EXPORT void belle_sip_listening_point_clean_channels(belle_sip_listening_point_t *lp);
+
+/**
+ * Get the number of channels managed by this listening point.
+**/
+BELLESIP_EXPORT int belle_sip_listening_point_get_channel_count(const belle_sip_listening_point_t *lp);
+BELLESIP_EXPORT int belle_sip_listening_point_get_well_known_port(const char *transport);
+
+BELLESIP_DEPRECATED BELLESIP_EXPORT int belle_sip_tls_listening_point_set_root_ca(belle_sip_tls_listening_point_t *s, const char *path);
+
+#define BELLE_SIP_TLS_LISTENING_POINT_BADCERT_CN_MISMATCH 	BELLE_TLS_VERIFY_CN_MISMATCH
+#define BELLE_SIP_TLS_LISTENING_POINT_BADCERT_ANY_REASON 	BELLE_TLS_VERIFY_ANY_REASON
+BELLESIP_DEPRECATED BELLESIP_EXPORT int belle_sip_tls_listening_point_set_verify_exceptions(belle_sip_tls_listening_point_t *s, int flags);
+BELLESIP_DEPRECATED BELLESIP_EXPORT int belle_sip_tls_listening_point_set_verify_policy(belle_sip_tls_listening_point_t *s, belle_tls_verify_policy_t *pol);
+BELLESIP_EXPORT int belle_sip_tls_listening_point_set_crypto_config(belle_sip_tls_listening_point_t *s, belle_tls_crypto_config_t *crypto_config);
+BELLESIP_EXPORT belle_tls_crypto_config_t *belle_sip_tls_listening_point_get_crypto_config(belle_sip_tls_listening_point_t *s);
+BELLESIP_EXPORT belle_sip_listening_point_t * belle_sip_tunnel_listening_point_new(belle_sip_stack_t *s, void *tunnelclient);
+
+
+#define BELLE_SIP_UDP_LISTENING_POINT(obj) BELLE_SIP_CAST(obj,belle_sip_udp_listening_point_t)
+#define BELLE_SIP_STREAM_LISTENING_POINT(obj) BELLE_SIP_CAST(obj,belle_sip_stream_listening_point_t)
+#define BELLE_SIP_TLS_LISTENING_POINT(obj) BELLE_SIP_CAST(obj,belle_sip_tls_listening_point_t)
+
+BELLE_SIP_END_DECLS
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/mainloop.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/mainloop.h"
new file mode 100755
index 0000000..9fe0db3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/mainloop.h"
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_MAINLOOP_H
+#define BELLE_SIP_MAINLOOP_H
+
+#define BELLE_SIP_EVENT_READ 1
+#define BELLE_SIP_EVENT_WRITE (1<<1)
+#define BELLE_SIP_EVENT_ERROR (1<<2)
+#define BELLE_SIP_EVENT_TIMEOUT (1<<3)
+
+typedef struct belle_sip_source belle_sip_source_t;
+
+BELLESIP_EXPORT int belle_sip_source_set_events(belle_sip_source_t* source, int event_mask);
+BELLESIP_EXPORT belle_sip_socket_t belle_sip_source_get_socket(const belle_sip_source_t* source);
+
+/**
+ * Callback function prototype for main loop notifications.
+ * Return value is important:
+ * BELLE_SIP_STOP => source is removed from main loop.
+ * BELLE_SIP_CONTINUE => source is kept, timeout is restarted if any according to last expiry time
+ * BELLE_SIP_CONTINUE_WITHOUT_CATCHUP => source is kept, timeout is restarted if any according to current time
+**/
+typedef int (*belle_sip_source_func_t)(void *user_data, unsigned int events);
+
+/*
+ * Call back fonction invoked when source is removed from main loop
+ */
+typedef void (*belle_sip_source_remove_callback_t)(belle_sip_source_t *);
+
+typedef void (*belle_sip_callback_t)(void *user_data);
+
+typedef struct belle_sip_main_loop belle_sip_main_loop_t;
+
+#define BELLE_SIP_CONTINUE_WITHOUT_CATCHUP 2
+#define BELLE_SIP_CONTINUE	1
+#define BELLE_SIP_STOP		0
+
+BELLE_SIP_BEGIN_DECLS
+
+BELLESIP_EXPORT void belle_sip_main_loop_add_source(belle_sip_main_loop_t *ml, belle_sip_source_t *source);
+
+BELLESIP_EXPORT void belle_sip_main_loop_remove_source(belle_sip_main_loop_t *ml, belle_sip_source_t *source);
+
+/**
+ * Creates a mainloop.
+**/
+BELLESIP_EXPORT belle_sip_main_loop_t *belle_sip_main_loop_new(void);
+
+/**
+ * Adds a timeout into the main loop
+ * @param ml
+ * @param func a callback function to be called to notify timeout expiration
+ * @param data a pointer to be passed to the callback
+ * @param timeout_value_ms duration of the timeout.
+ * @returns timeout id
+**/
+BELLESIP_EXPORT unsigned long belle_sip_main_loop_add_timeout(belle_sip_main_loop_t *ml, belle_sip_source_func_t func, void *data, unsigned int timeout_value_ms);
+
+/**
+ * Adds a timeout into the main loop
+ * The caller of this function is responsible for freeing (with belle_sip_object_unref()) the returned belle_sip_source_t object when it is no longer
+ * needed.
+ * @param ml
+ * @param func a callback function to be called to notify timeout expiration
+ * @param data a pointer to be passed to the callback
+ * @param timeout_value_ms duration of the timeout.
+ * @param timer_name name of the timer, can be null
+ * @returns timeout belle_sip_source_t  with ref count = 1
+**/
+BELLESIP_EXPORT belle_sip_source_t* belle_sip_main_loop_create_timeout(belle_sip_main_loop_t *ml
+							, belle_sip_source_func_t func
+							, void *data
+							, unsigned int timeout_value_ms
+							,const char* timer_name);
+
+/**
+ * Adds a timeout into the main loop
+ * The caller of this function is responsible for freeing (with belle_sip_object_unref()) the returned belle_sip_source_t object when it is no longer
+ * needed.
+ * @param ml
+ * @param func a callback function to be called to notify timeout expiration
+ * @param data a pointer to be passed to the callback
+ * @param timeout_value_ms duration of the timeout.
+ * @param timer_name name of the timer, can be null
+ * @param function called when source is removed, can be null
+ * @returns timeout belle_sip_source_t  with ref count = 1
+ **/
+BELLESIP_EXPORT belle_sip_source_t* belle_sip_main_loop_create_timeout_with_remove_cb (belle_sip_main_loop_t *ml
+																					   , belle_sip_source_func_t func
+																					   , void *data
+																					   , unsigned int timeout_value_ms
+																					   , const char* timer_name
+																					   , belle_sip_source_remove_callback_t remove_func);
+
+
+/**
+ * Schedule an arbitrary task at next main loop iteration.
+**/
+BELLESIP_EXPORT void belle_sip_main_loop_do_later(belle_sip_main_loop_t *ml, belle_sip_callback_t func, void *data);
+
+/**
+ * Creates a timeout source, similarly to belle_sip_main_loop_add_timeout().
+ * However in this case the timeout must be entered manually using belle_sip_main_loop_add_source().
+ * Its pointer can be used to remove it from the source (that is cancelling it).
+**/
+BELLESIP_EXPORT belle_sip_source_t * belle_sip_timeout_source_new(belle_sip_source_func_t func, void *data, unsigned int timeout_value_ms);
+
+BELLESIP_EXPORT void belle_sip_source_set_timeout(belle_sip_source_t *s, unsigned int value_ms);
+/**
+ * Cancel a source. Will be removed at next iterate. It is not freed.
+ **/
+BELLESIP_EXPORT void belle_sip_source_cancel(belle_sip_source_t * src);
+
+
+BELLESIP_EXPORT unsigned int belle_sip_source_get_timeout(const belle_sip_source_t *s);
+
+BELLESIP_EXPORT belle_sip_source_t * belle_sip_socket_source_new(belle_sip_source_func_t func, void *data, belle_sip_socket_t fd, unsigned int events, unsigned int timeout_value_ms);
+/*
+ * register a callback invoked once source is removed from mainloop
+ */
+BELLESIP_EXPORT void belle_sip_source_set_remove_cb(belle_sip_source_t *s, belle_sip_source_remove_callback_t func);
+
+BELLESIP_EXPORT unsigned long belle_sip_source_get_id(const belle_sip_source_t *s);
+
+BELLESIP_EXPORT void * belle_sip_source_get_user_data(const belle_sip_source_t *s);
+BELLESIP_EXPORT void belle_sip_source_set_user_data(belle_sip_source_t *s, void *user_data);
+
+BELLESIP_EXPORT belle_sip_source_t *belle_sip_main_loop_find_source(belle_sip_main_loop_t *ml, unsigned long id);
+
+/**
+ * Executes the main loop forever (or until belle_sip_main_loop_quit() is called)
+**/
+BELLESIP_EXPORT void belle_sip_main_loop_run(belle_sip_main_loop_t *ml);
+
+/**
+ * Executes the main loop for the time specified in milliseconds.
+**/
+BELLESIP_EXPORT void belle_sip_main_loop_sleep(belle_sip_main_loop_t *ml, int milliseconds);
+
+/**
+ * Break out the main loop.
+**/
+BELLESIP_EXPORT int belle_sip_main_loop_quit(belle_sip_main_loop_t *ml);
+
+/**
+ * Cancel (removes) a source. It is not freed.
+**/
+BELLESIP_EXPORT void belle_sip_main_loop_cancel_source(belle_sip_main_loop_t *ml, unsigned long id);
+
+BELLE_SIP_END_DECLS
+#ifndef BELLE_SIP_USE_STL
+#define BELLE_SIP_USE_STL 1
+#endif
+
+#if ((defined(WIN32) && defined(__cplusplus)) || __cplusplus >= 201103L) && BELLE_SIP_USE_STL
+/*Only Visual Studio 2018 properly defines __cplusplus according to c++ level. */
+
+#include <functional>
+
+typedef std::function<int (unsigned int)> belle_sip_source_cpp_func_t;
+
+
+/*purpose of this function is to simplify c++ timer integration.
+ * ex:
+ * std::string helloworld("Hello world):
+ * belle_sip_source_cpp_func_t *func = new belle_sip_source_cpp_func_t([helloworld](unsigned int events) {
+ *						std::cout << helloworld << std::endl;
+ *						return BELLE_SIP_STOP;
+ *					});
+ *create timer
+ *mTimer = belle_sip_main_loop_create_cpp_timeout( mainloop
+ *												, func
+ *												, 1000
+ *												,"timer for c++");
+ *
+ */
+
+BELLESIP_EXPORT belle_sip_source_t * belle_sip_main_loop_create_cpp_timeout(belle_sip_main_loop_t *ml
+								, belle_sip_source_cpp_func_t *func
+								, unsigned int timeout_value_ms
+								, const char* timer_name);
+
+BELLESIP_EXPORT void belle_sip_main_loop_cpp_do_later(belle_sip_main_loop_t *ml, const std::function<void (void)> &func);
+
+
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/mdns_register.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/mdns_register.h"
new file mode 100755
index 0000000..45cc933
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/mdns_register.h"
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_MDNS_REGISTER_H
+#define BELLE_SIP_MDNS_REGISTER_H
+
+typedef struct belle_sip_mdns_register belle_sip_mdns_register_t;
+#define BELLE_SIP_MDNS_REGISTER(obj) BELLE_SIP_CAST(obj,belle_sip_mdns_register_t)
+
+/**
+ * Callback prototype for asynchronous multicast DNS registration (advertisement).
+ */
+typedef void (*belle_sip_mdns_register_callback_t)(void *data, int error);
+
+BELLE_SIP_BEGIN_DECLS
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+ * Tells if multicast DNS is available.
+ * @return true if it is available, false otherwise.
+**/
+BELLESIP_EXPORT int belle_sip_mdns_register_available(void);
+
+/**
+ * Asynchronously performs the mdns registration (advertisement).
+ * @param service the queried service ("sip", "stun", "turn"...).
+ * @param transport the queried transport ("udp", "tcp", "tls").
+ * @param domain the local domain name in which the service will be registered.
+ * @param name the name of the mdns service, if NULL it is the computer's name. Only useful for multiple registrations to avoid conflicts.
+ * @param port the port of the service.
+ * @param priority the priority of the service, lower value means more preferred.
+ * @param weight a relative weight for services within the same local domain that have the same priority, higher value means more preferred.
+ * @param ttl the time to live of the resulted srv
+ * @param cb a callback function that will be called to notify the results.
+ * @param data a user pointer passed through the callback as first argument.
+ * @return a #belle_sip_register_t that can be used to cancel the registration if needed. The context must have been ref'd with belle_sip_object_ref().
+**/
+BELLESIP_EXPORT belle_sip_mdns_register_t *belle_sip_mdns_register(const char *service, const char *transport, const char *domain, const char* name, int port, int prio, int weight, int ttl,  belle_sip_mdns_register_callback_t cb, void *data);
+
+/**
+ * Cancels the mdns registration.
+ * @param context the belle_sip_mdns_register_t used to register the service.
+**/
+BELLESIP_EXPORT void belle_sip_mdns_unregister(belle_sip_mdns_register_t *context);
+
+#ifdef __cplusplus
+} /* end extern "C" */
+#endif
+
+BELLE_SIP_END_DECLS
+
+#endif /* BELLE_SIP_MDNS_REGISTER_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/message.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/message.h"
new file mode 100755
index 0000000..94801ac
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/message.h"
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_MESSAGE_H
+#define BELLE_SIP_MESSAGE_H
+
+#include "belle-sip/headers.h"
+
+#define BELLE_SIP_MESSAGE(obj)		BELLE_SIP_CAST(obj,belle_sip_message_t)
+#define BELLE_SIP_REQUEST(obj)		BELLE_SIP_CAST(obj,belle_sip_request_t)
+#define BELLE_SIP_RESPONSE(obj)		BELLE_SIP_CAST(obj,belle_sip_response_t)
+
+BELLE_SIP_BEGIN_DECLS
+
+BELLESIP_EXPORT belle_sip_message_t* belle_sip_message_parse(const char* raw);
+/**
+ * Parse sip message from a raw buffer
+ * @param [in] buff buffer to be parsed
+ * @param [in] buff_length size of the buffer to be parsed
+ * @param [out] message_length number of bytes read
+ * @return parsed message
+ */
+BELLESIP_EXPORT belle_sip_message_t* belle_sip_message_parse_raw (const char* buff, size_t buff_length,size_t* message_length );
+
+
+
+BELLESIP_EXPORT int belle_sip_message_is_request(belle_sip_message_t *msg);
+BELLESIP_EXPORT belle_sip_request_t* belle_sip_request_new(void);
+BELLESIP_EXPORT belle_sip_request_t* belle_sip_request_parse(const char* raw);
+
+BELLESIP_EXPORT belle_sip_request_t* belle_sip_request_create(belle_sip_uri_t *requri, const char* method,
+                                         belle_sip_header_call_id_t *callid,
+                                         belle_sip_header_cseq_t *cseq,
+                                         belle_sip_header_from_t *from,
+                                         belle_sip_header_to_t *to,
+                                         belle_sip_header_via_t *via,
+                                         int max_forwards);
+
+
+
+
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_request_get_uri(const belle_sip_request_t* request);
+BELLESIP_EXPORT void belle_sip_request_set_uri(belle_sip_request_t* request, belle_sip_uri_t* uri);
+BELLESIP_EXPORT const char* belle_sip_request_get_method(const belle_sip_request_t* request);
+BELLESIP_EXPORT void belle_sip_request_set_method(belle_sip_request_t* request,const char* method);
+/**
+ * Guess the origin of the received sip message from VIA header (thanks to received/rport)
+ * @param req request to be analyzed
+ * @ return a newly allocated uri
+ * */
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_request_extract_origin(const belle_sip_request_t* req);
+
+/**
+ * Clone all sip headers + body if any
+ * @param  req message to be cloned
+ * @return newly allocated request
+ */
+BELLESIP_EXPORT belle_sip_request_t * belle_sip_request_clone_with_body(const belle_sip_request_t *initial_req);
+
+/**
+ * returns an absolute uri. A header address cannot have both a sip uri and an absolute uri.
+ */
+BELLESIP_EXPORT belle_generic_uri_t* belle_sip_request_get_absolute_uri(const belle_sip_request_t* req);
+/**
+ * set an absolute uri. A header address cannot have both a sip uri and an absolute uri. This function also to uri to NULL
+ */
+BELLESIP_EXPORT void belle_sip_request_set_absolute_uri(belle_sip_request_t* req, belle_generic_uri_t* uri);
+
+
+
+
+
+BELLESIP_EXPORT int belle_sip_message_is_response(const belle_sip_message_t *msg);
+
+BELLESIP_EXPORT belle_sip_header_t *belle_sip_message_get_header(const belle_sip_message_t *msg, const char *header_name);
+
+BELLESIP_EXPORT belle_sip_object_t *_belle_sip_message_get_header_by_type_id(const belle_sip_message_t *message, belle_sip_type_id_t id);
+
+#define belle_sip_message_get_header_by_type(msg,header_type)\
+	(header_type*)_belle_sip_message_get_header_by_type_id(BELLE_SIP_MESSAGE(msg),BELLE_SIP_TYPE_ID(header_type))
+
+BELLESIP_EXPORT const belle_sip_list_t* belle_sip_message_get_headers(const belle_sip_message_t *message,const char* header_name);
+/**
+ * Get list of all headers present in the message.
+ * @param message
+ * @return a newly allocated list of belle_sip_header_t
+ * */
+BELLESIP_EXPORT belle_sip_list_t* belle_sip_message_get_all_headers(const belle_sip_message_t *message);
+
+BELLESIP_EXPORT void belle_sip_message_add_first(belle_sip_message_t *msg, belle_sip_header_t* header);
+
+/**
+ * add an header to this message
+ * @param msg
+ * @param header to add, must be one of header type
+ */
+BELLESIP_EXPORT void belle_sip_message_add_header(belle_sip_message_t *msg, belle_sip_header_t* header);
+
+BELLESIP_EXPORT void belle_sip_message_add_headers(belle_sip_message_t *message, const belle_sip_list_t *header_list);
+
+BELLESIP_EXPORT void belle_sip_message_set_header(belle_sip_message_t *msg, belle_sip_header_t* header);
+
+BELLESIP_EXPORT void belle_sip_message_remove_first(belle_sip_message_t *msg, const char *header_name);
+
+BELLESIP_EXPORT void belle_sip_message_remove_last(belle_sip_message_t *msg, const char *header_name);
+
+BELLESIP_EXPORT void belle_sip_message_remove_header(belle_sip_message_t *msg, const char *header_name);
+
+BELLESIP_EXPORT void belle_sip_message_remove_header_from_ptr(belle_sip_message_t *msg, belle_sip_header_t* header);
+
+
+BELLESIP_EXPORT char *belle_sip_message_to_string(belle_sip_message_t *msg);
+
+BELLESIP_EXPORT belle_sip_body_handler_t *belle_sip_message_get_body_handler(const belle_sip_message_t *msg);
+
+BELLESIP_EXPORT void belle_sip_message_set_body_handler(belle_sip_message_t *msg, belle_sip_body_handler_t *body_handler);
+
+BELLESIP_EXPORT const char* belle_sip_message_get_body(belle_sip_message_t *msg);
+
+BELLESIP_EXPORT size_t belle_sip_message_get_body_size(const belle_sip_message_t *msg);
+
+BELLESIP_EXPORT void belle_sip_message_set_body(belle_sip_message_t *msg,const char* body,size_t size);
+
+BELLESIP_EXPORT void belle_sip_message_assign_body(belle_sip_message_t *msg, char* body, size_t size);
+
+BELLESIP_EXPORT int belle_sip_response_get_status_code(const belle_sip_response_t *response);
+BELLESIP_EXPORT void belle_sip_response_set_status_code(belle_sip_response_t *response,int status);
+
+BELLESIP_EXPORT const char* belle_sip_response_get_reason_phrase(const belle_sip_response_t *response);
+BELLESIP_EXPORT void belle_sip_response_set_reason_phrase(belle_sip_response_t *response,const char* reason_phrase);
+
+
+BELLESIP_EXPORT belle_sip_response_t *belle_sip_response_new(void);
+
+BELLESIP_EXPORT belle_sip_response_t *belle_sip_response_create_from_request(belle_sip_request_t *req, int status_code);
+/**
+ * This method takes  received/rport/via value of the reponse and update the contact IP/port accordingly
+ * @param response use to extract via/received/rport from top most via.
+ * @param contact contact to be updated
+ * @returns 0 if no error
+ * */
+BELLESIP_EXPORT int belle_sip_response_fix_contact(const belle_sip_response_t* response,belle_sip_header_contact_t* contact);
+
+/**
+ * Check for mandatory headers and parameters.
+ * If message does not satisfy minimum requirements return FALSE, otherwise return TRUE.
+**/
+BELLESIP_EXPORT int belle_sip_message_check_headers(const belle_sip_message_t* message);
+
+/**
+ * check uri components of headers and req uri.
+ * return 0 if not compliant
+ * */
+BELLESIP_EXPORT int belle_sip_request_check_uris_components(const belle_sip_request_t* request);
+
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/object++.hh" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/object++.hh"
new file mode 100755
index 0000000..fb44c91
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/object++.hh"
@@ -0,0 +1,194 @@
+/*
+	belle-sip - SIP (RFC3261) library.
+	Copyright (C) 2019  Belledonne Communications SARL
+
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef belle_sip_object_plusplus_h
+#define belle_sip_object_plusplus_h
+
+#include "belle-sip/types.h"
+#include "belle-sip/object.h"
+#include "belle-sip/utils.h"
+
+#include <memory>
+#include <list>
+#include <functional>
+
+namespace bellesip {
+
+class ObjectCAccessors;
+
+class BELLESIP_EXPORT Object {
+	friend ObjectCAccessors;
+	public:
+		Object();
+		Object *ref();
+		const Object *ref() const;
+		void unref();
+		//Overrides should keep	the size of toString() lower than BELLE_SIP_MAX_TO_STRING_SIZE
+	        virtual std::string toString() const;
+		virtual Object *clone()const;
+		belle_sip_cpp_object_t *getCObject();
+		const belle_sip_cpp_object_t *getCObject()const;
+		void *getCPtr(){
+			return static_cast<void*>(getCObject());
+		}
+		const void *getCPtr()const{
+			return static_cast<const void*>(getCObject());
+		}
+		static Object *getCppObject(void *);
+		static const Object *getCppObject(const void *);
+
+	protected:
+		virtual ~Object(); /*the destructor must be kept protected, never public, including for all classes inherting from this*/
+		Object(const Object &other);
+		void constUnref()const;
+	private:
+		void init();
+		mutable belle_sip_cpp_object_t mObject;
+		belle_sip_error_code marshal(char* buff, size_t buff_size, size_t *offset);
+};
+
+/**
+ * Template class to help define an Object usable in both C and C++
+ * The template arguments are:
+ * - _CType : the type used to represent this object in C
+ * - _CppType : the type used in C++ to implement this object. _CppType is used to be set to the type
+ *   of the class inheriting from HybridObject.
+ * Example:
+ * typedef struct _CExample CExample;
+ * class Example : public HybridObject<CExample, Example>{
+ * ...
+ * }
+ * The C object can be obtained with toC() method, directly casted in the expected type.
+ * The C++ object can be obtained from C object with static method toCpp().
+ * The destructor MUST be kept protected so that no one can call delete operator on the object. Instead unref() must be used.
+ * make_shared<>() MUST NOT be used to instanciate an HybridObject, use create() instead.
+ * a shared_ptr<> can be obtained at any time from an HybridObject using getSharedFromThis().
+ * The static getSharedFromThis(_Ctype*) method can be used to directly obtain a shared_ptr from the C object.
+ * 
+ * The clone() method must be overriden to return a new _CppType contructed with copy contructor,
+ * or return nullptr if the object is defined to be not clonable.
+ *
+ * Rational for using this template:
+ * - You have an existing library in C where all C objects are inheriting from belle_sip_object_t (for refcounting, data_set etc...).
+ * - You want to use C++ in your library without making any disruption in the API.
+ * IMPORTANT: 
+ * If you don't care about belle_sip_object_t inheritance in your C api, 
+ * or if you don't need any C api associated to this object at all, DON'T USE THIS.
+ * An usage example is shown in tester/object_tester.cc .
+**/
+template <typename _CType, typename _CppType>
+class HybridObject : public Object {
+	public:
+		//Create the C++ object returned as a shared_ptr. Ref is managed by shared_ptr, unref will be called on last ref.
+		template <typename... _Args>
+		static inline std::shared_ptr<_CppType> create(_Args&&... __args) {
+			return (new _CppType(std::forward<_Args>(__args)...))->toSharedPtr();
+		}
+		//Convenience creator to get the C object object instead. Automatically aquires a ref. Consumers have the responsibility to unref
+		template <typename... _Args>
+		static inline _CType *createCObject(_Args&&... __args) {
+			_CppType *obj = new _CppType(std::forward<_Args>(__args)...);
+			return obj->toC();
+		}
+		//Obtain the C object from this.
+		_CType *toC(){
+			return static_cast<_CType*>(getCPtr());
+		}
+		//Obtain the C object this, when it is const.
+		const _CType *toC()const{
+			return static_cast<const _CType*>(getCPtr());
+		}
+		//Obtain the C++ object as a normal pointer.
+		static _CppType *toCpp(_CType *ptr){
+			return static_cast<_CppType *>(getCppObject(ptr));
+		}
+		//Obtain the C++ object as a normal pointer, when the c++ object is const.
+		static const _CppType *toCpp(const _CType *ptr){
+			return static_cast<const _CppType *>(getCppObject(ptr));
+		}
+		//Obtain a shared_ptr from the C++ object.
+		std::shared_ptr<_CppType> getSharedFromThis() {
+			this->ref();
+			return std::shared_ptr<_CppType>(static_cast<_CppType *>(this), std::mem_fun(&Object::unref));
+		}
+		//Obtain a shared_ptr from the C++ object in the const case.
+		std::shared_ptr<const _CppType> getSharedFromThis () const {
+			this->ref();
+			return std::shared_ptr<const _CppType>(static_cast<const _CppType *>(this), std::mem_fun(&HybridObject<_CType,_CppType>::constUnref));
+		}
+		//Convenience method for easy CType -> shared_ptr<CppType> conversion
+		static std::shared_ptr<_CppType> getSharedFromThis(_CType *ptr) {
+			return toCpp(ptr)->getSharedFromThis();
+		}
+		//Convenience method for easy CType -> shared_ptr<CppType> conversion
+		static std::shared_ptr<const _CppType> getSharedFromThis(const _CType *ptr) {
+			return toCpp(const_cast<_CType *>(ptr))->getSharedFromThis();
+		}
+		// Obtain a shared_ptr that takes ownership of the object.
+		// Use this method with caution as it will transfer the ownership of the object to the shared_ptr, unlike getSharedFromThis() that
+		// gives you a new reference to the object.
+		// This method should be only useful to transfer into a shared_ptr an object that was created as a normal pointer, for example
+		// by clone() method.
+		// There should be NO const variant of this method.
+		std::shared_ptr<_CppType> toSharedPtr(){
+			return std::shared_ptr<_CppType>(static_cast<_CppType *>(this), std::mem_fun(&Object::unref));
+		}
+		
+		//Convenience method for easy bctbx_list(_Ctype) -> std::list<_CppType> conversion
+		static std::list<_CppType> getCppListFromCList(const bctbx_list_t *cList) {
+			std::list<_CppType> result;
+			for (auto it = cList; it; it = bctbx_list_next(it))
+				result.push_back(toCpp(static_cast<_CType>(bctbx_list_get_data(it))));
+			return result;
+		}
+		//Convenience method for easy bctbx_list(_Ctype) -> std::list<_CppType> conversion
+		//Applies 'func' to get _CppType from _CType. Used in case we do not want to call  `toCpp` on _Ctype
+		static std::list<_CppType> getCppListFromCList(const bctbx_list_t *cList, const std::function<_CppType (_CType)> &func) {
+			std::list<_CppType> result;
+			for (auto it = cList; it; it = bctbx_list_next(it))
+			 	result.push_back(func(static_cast<_CType>(bctbx_list_get_data(it))));
+			return result;
+		}
+		//Convenience method for easy std::list<shared_ptr<CppType>> -> bctbx_list(CType) conversion
+		static bctbx_list_t* getCListFromCppList(const std::list<std::shared_ptr<_CppType> > &cppList) {
+			bctbx_list_t *result = nullptr;
+			for (auto it = cppList.begin(); it != cppList.end(); it++) {
+				std::shared_ptr<_CppType> cppPtr = static_cast<std::shared_ptr<_CppType>>(*it);
+				cppPtr->ref();
+				_CType *cptr = cppPtr->toC();
+				result = bctbx_list_append(result, cptr);
+			}
+			return result;
+		}
+
+	protected:
+		virtual ~HybridObject() {}
+		HybridObject() {}
+		HybridObject(const HybridObject<_CType, _CppType> &other) : Object(other) {}
+};
+
+
+}//end of namespace
+
+extern "C" {
+	BELLE_SIP_DECLARE_VPTR(belle_sip_cpp_object_t);
+}
+
+
+
+#endif //belle_sip_object_plusplus_h
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/object.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/object.h"
new file mode 100755
index 0000000..eb777b7
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/object.h"
@@ -0,0 +1,546 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_sip_object_h
+#define belle_sip_object_h
+
+#include "belle-sip/defs.h"
+#include "belle-sip/utils.h"
+#include "belle-sip/list.h"
+
+/*
+ * typedefs, macros and functions for object definition and manipulation.
+ */
+
+#define BELLE_SIP_DEFAULT_BUFSIZE_HINT 0
+
+#define BELLE_SIP_TYPE_ID(_type) _type##_id
+
+typedef unsigned int belle_sip_type_id_t;
+
+#define BELLE_SIP_DECLARE_TYPES_BEGIN(namezpace,unique_namespace_id) \
+	enum namezpace##type_ids{\
+		namezpace##type_id_first=unique_namespace_id,
+
+#define BELLE_SIP_DECLARE_TYPES_END };
+
+#define BELLE_SIP_OBJECT_VPTR_NAME(object_type)	object_type##_vptr
+
+#define BELLE_SIP_OBJECT_GET_VPTR_FUNC(object_type) object_type##_vptr_get
+
+#define BELLE_SIP_OBJECT_VPTR_TYPE(object_type)	object_type##_vptr_t
+
+#define BELLE_SIP_DECLARE_VPTR(object_type) \
+	typedef belle_sip_object_vptr_t BELLE_SIP_OBJECT_VPTR_TYPE(object_type);\
+	BELLESIP_EXPORT BELLE_SIP_OBJECT_VPTR_TYPE(object_type) * BELLE_SIP_OBJECT_GET_VPTR_FUNC(object_type)(void);
+
+#define BELLE_SIP_DECLARE_CUSTOM_VPTR_BEGIN(object_type, parent_type) \
+	typedef struct object_type##_vptr_struct BELLE_SIP_OBJECT_VPTR_TYPE(object_type);\
+	BELLESIP_EXPORT BELLE_SIP_OBJECT_VPTR_TYPE(object_type) * BELLE_SIP_OBJECT_GET_VPTR_FUNC(object_type)(void); \
+	struct object_type##_vptr_struct{\
+		BELLE_SIP_OBJECT_VPTR_TYPE(parent_type) base;
+
+#define BELLE_SIP_DECLARE_VPTR_NO_EXPORT(object_type) \
+	typedef belle_sip_object_vptr_t BELLE_SIP_OBJECT_VPTR_TYPE(object_type);\
+	BELLE_SIP_OBJECT_VPTR_TYPE(object_type) * BELLE_SIP_OBJECT_GET_VPTR_FUNC(object_type)(void);
+
+#define BELLE_SIP_DECLARE_CUSTOM_VPTR_BEGIN_NO_EXPORT(object_type, parent_type) \
+	typedef struct object_type##_vptr_struct BELLE_SIP_OBJECT_VPTR_TYPE(object_type);\
+	BELLE_SIP_OBJECT_VPTR_TYPE(object_type) * BELLE_SIP_OBJECT_GET_VPTR_FUNC(object_type)(void); \
+	struct object_type##_vptr_struct{\
+		BELLE_SIP_OBJECT_VPTR_TYPE(parent_type) base;
+
+#define BELLE_SIP_DECLARE_CUSTOM_VPTR_END };
+
+#define BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_BEGIN(object_type) \
+	extern BELLE_SIP_OBJECT_VPTR_TYPE(object_type) BELLE_SIP_OBJECT_VPTR_NAME(object_type);\
+	BELLE_SIP_OBJECT_VPTR_TYPE(object_type) * BELLE_SIP_OBJECT_GET_VPTR_FUNC(object_type)(void){\
+		return &BELLE_SIP_OBJECT_VPTR_NAME(object_type); \
+	}\
+	BELLE_SIP_OBJECT_VPTR_TYPE(object_type) BELLE_SIP_OBJECT_VPTR_NAME(object_type)={
+
+#define BELLE_SIP_INSTANCIATE_CUSTOM_VPTR_END };
+
+#define BELLE_SIP_VPTR_INIT(object_type,parent_type,unowned) \
+		BELLE_SIP_TYPE_ID(object_type), \
+		sizeof(object_type), \
+		#object_type,\
+		unowned,\
+		(belle_sip_object_get_vptr_t)BELLE_SIP_OBJECT_GET_VPTR_FUNC(parent_type), \
+		(belle_sip_interface_desc_t**)object_type##interfaces_table
+
+#define BELLE_SIP_INSTANCIATE_VPTR3(object_type,parent_type,destroy,clone,marshal,on_first_ref,on_last_ref,unowned,is_cpp) \
+static BELLE_SIP_OBJECT_VPTR_TYPE(object_type) BELLE_SIP_OBJECT_VPTR_NAME(object_type)={ \
+	BELLE_SIP_VPTR_INIT(object_type,parent_type,unowned), \
+	(belle_sip_object_destroy_t)destroy,	\
+	(belle_sip_object_clone_t)clone,	\
+	(belle_sip_object_marshal_t)marshal,\
+	(belle_sip_object_on_first_ref_t)on_first_ref,\
+	(belle_sip_object_on_last_ref_t)on_last_ref,\
+	BELLE_SIP_DEFAULT_BUFSIZE_HINT,\
+	is_cpp, 0\
+	}; \
+	BELLE_SIP_OBJECT_VPTR_TYPE(object_type) * BELLE_SIP_OBJECT_GET_VPTR_FUNC(object_type)(void){\
+		return &BELLE_SIP_OBJECT_VPTR_NAME(object_type); \
+	}
+
+#define BELLE_SIP_INSTANCIATE_VPTR2(object_type,parent_type,destroy,clone,marshal,on_first_ref,on_last_ref,unowned) \
+	BELLE_SIP_INSTANCIATE_VPTR3(object_type,parent_type,destroy,clone,marshal,on_first_ref,on_last_ref,unowned,FALSE)
+
+
+#define BELLE_SIP_INSTANCIATE_VPTR(object_type,parent_type,destroy,clone,marshal,unowned) \
+		BELLE_SIP_INSTANCIATE_VPTR2(object_type, parent_type, destroy, clone, marshal, NULL, NULL, unowned)
+/**
+ * belle_sip_object_t is the base object.
+ * It is the base class for all belle sip non trivial objects.
+ * It owns a reference count which allows to trigger the destruction of the object when the last
+ * user of it calls belle_sip_object_unref().
+ *
+ * It contains a generic data store that allows users to store named data in it and retrieve them afterwards.
+ *
+ * About object lifecycle<br>
+ * In belle-sip, objects can be, depending on their types, initially owned, meaning that they are created with a ref count of 1, or
+ * initially unowned, meaning that they are created with reference count of 0. Such objets are also referred as "floating object". They are automatically destroyed
+ * by the main loop iteration, so a floating object can be seen as a temporary object, until someones calls belle_sip_object_ref() on it.
+ *
+ * In order to know whether a kind of object is initially owned or initially unowned, you can use the test program tester/belle_sip_object_describe.
+ * This tool gives the hierarchy and properties of the object type whose name is supplied in argument. For example:
+ *
+ * <pre>./tester/belle_sip_object_describe belle_sip_request_t</pre>
+ *
+ * The object memory management depends slightly on whether an object type is created initially owned or not.
+ * In order not to be lost and make memory fault or leaks, consider the following rules:
+ *
+ * When an object is of type initially unowned:
+ * * call belle_sip_object_ref() on it only if you need a pointer to this object to be used outside the scope of the current function.
+ * * call belle_sip_object_unref() on it only if you previously called belle_sip_object_ref().
+ *
+ * When an object is of type initially owned:
+ * * you can safely store its pointer.
+ * * use belle_sip_object_unref() when you no longer need it.
+ *
+ * Also, keep in mind that most objects of belle-sip are initially unowned, especially
+ * * all objects who are usually required to be used inside another object (for example: an URI is part of a from header, a contact header is part of a message)
+ * * all objects whose lifecyle is maintained by the stack: transactions, dialogs.
+ *
+ * On the contrary, top level objects whose lifecyle belongs only to the application are initially owned:
+ * * belle_sip_provider_t, belle_sip_stack_t, belle_sip_source_t.
+ *
+ * Internally, belle-sip objects containing pointers to other objects must take a reference count on the other objects they hold; and leave this reference
+ * when they no longer need it. This rule must be strictly followed by developers doing things inside belle-sip.
+**/
+
+typedef struct _belle_sip_object belle_sip_object_t;
+//cpp object differ only in vptr, just typedef to belle_sip_object_t for simplicity
+typedef struct _belle_sip_object belle_sip_cpp_object_t;
+
+typedef void (*belle_sip_object_destroy_t)(belle_sip_object_t*);
+typedef void (*belle_sip_object_clone_t)(belle_sip_object_t* obj, const belle_sip_object_t *orig);
+typedef belle_sip_error_code (*belle_sip_object_marshal_t)(belle_sip_object_t* obj, char* buff, size_t buff_size, size_t *offset);
+typedef struct _belle_sip_object_vptr *(*belle_sip_object_get_vptr_t)(void);
+typedef void (*belle_sip_object_on_first_ref_t)(belle_sip_object_t*);
+typedef void (*belle_sip_object_on_last_ref_t)(belle_sip_object_t*);
+
+struct _belle_sip_object_vptr{
+	belle_sip_type_id_t id;
+	size_t size; /*the size of the object - not the vptr size*/
+	const char *type_name;
+	int initially_unowned;
+	belle_sip_object_get_vptr_t get_parent;
+	struct belle_sip_interface_desc **interfaces; /*NULL terminated table of */
+	belle_sip_object_destroy_t destroy;
+	belle_sip_object_clone_t clone;
+	belle_sip_object_marshal_t marshal;
+	belle_sip_object_on_first_ref_t on_first_ref; /*called when object is ref'd for the first time*/
+	belle_sip_object_on_last_ref_t on_last_ref; /*called in unref() when the last reference of the object remains*/
+	int tostring_bufsize_hint; /*optimization: you can suggest here the typical size for a to_string() result.*/
+	int is_cpp; /*indicates whether this object kind is defined in c++*/
+	int cpp_offset; /*offset to apply to the belle_sip_object_t to find the pointer to the corresponding bellesip::Object, if any*/
+};
+
+typedef struct _belle_sip_object_vptr belle_sip_object_vptr_t;
+
+struct _belle_sip_object{
+	belle_sip_object_vptr_t *vptr;
+	int ref;
+	char* name;
+	struct weak_ref *weak_refs;
+	struct belle_sip_object_pool *pool;
+	belle_sip_list_t *pool_iterator;
+	belle_sip_list_t *data_store;
+};
+
+BELLE_SIP_BEGIN_DECLS
+
+
+BELLESIP_EXPORT belle_sip_object_t * _belle_sip_object_new(size_t objsize, belle_sip_object_vptr_t *vptr);
+
+#ifdef __cplusplus
+#define belle_sip_object_new(_type) reinterpret_cast<_type*>(static_cast<void *>(_belle_sip_object_new(sizeof(_type),(belle_sip_object_vptr_t*)BELLE_SIP_OBJECT_GET_VPTR_FUNC(_type)())))
+#else
+#define belle_sip_object_new(_type) (_type*)_belle_sip_object_new(sizeof(_type),(belle_sip_object_vptr_t*)BELLE_SIP_OBJECT_GET_VPTR_FUNC(_type)())
+#endif
+
+/**
+ * Activates checks on object marshalling.
+ * Useful for debug purposes.
+ * @param enable TRUE to enable, FALSE to disable.
+**/
+BELLESIP_EXPORT void belle_sip_object_enable_marshal_check(int enable);
+
+/**
+ * Activates an object leak detector. When enabled, belle-sip will reference all created objects.
+ * At program termination, application can check if objects remain alive using belle_sip_object_get_object_count() and dump them with
+ * belle_sip_object_dump_active_objects().
+ * @warning this must not be used in multi-threaded programs (when multiple threads can access belle-sip at the same time)
+ * Useful for debug purposes.
+ * @param enable TRUE to enable, FALSE to disable.
+**/
+BELLESIP_EXPORT void belle_sip_object_enable_leak_detector(int enable);
+
+BELLESIP_EXPORT int belle_sip_object_get_object_count(void);
+
+BELLESIP_EXPORT void belle_sip_object_flush_active_objects(void);
+
+BELLESIP_EXPORT void belle_sip_object_dump_active_objects(void);
+/*
+ * Might be used to explicitly remove an object from leak detector.
+*/
+BELLESIP_EXPORT void belle_sip_object_remove_from_leak_detector(belle_sip_object_t *obj);
+
+/**
+ * Suspend leak detector from this point. If the leak detector wasn't activated, this function does nothing.
+ * This can be useful to make object allocation that have to remain active beyond the scope of a test.
+**/
+BELLESIP_EXPORT void belle_sip_object_inhibit_leak_detector(int yes);
+
+int belle_sip_object_is_unowed(const belle_sip_object_t *obj);
+
+/**
+ * Increments reference counter, which prevents the object from being destroyed.
+ * If the object is initially unowed, this acquires the first reference.
+ *
+**/
+BELLESIP_EXPORT belle_sip_object_t * belle_sip_object_ref(void *obj);
+
+/**
+ * Decrements the reference counter. When it drops to zero, the object is destroyed.
+**/
+BELLESIP_EXPORT void belle_sip_object_unref(void *obj);
+
+/**
+ * Decrements the reference counter. When it drops to zero, the object is destroyed and returns TRUE. Otherwise returns FALSE.
+**/
+BELLESIP_EXPORT int belle_sip_object_unref_2(void *obj);
+
+typedef void (*belle_sip_object_destroy_notify_t)(void *userpointer, belle_sip_object_t *obj_being_destroyed);
+/**
+ * Add a weak reference to object.
+ * When object will be destroyed, then the destroy_notify callback will be called.
+ * This allows another object to be informed when object is destroyed, and then possibly
+ * cleanups pointer it holds to this object.
+**/
+BELLESIP_EXPORT belle_sip_object_t *belle_sip_object_weak_ref(void *obj, belle_sip_object_destroy_notify_t destroy_notify, void *userpointer);
+
+/**
+ * Remove a weak reference to object.
+**/
+BELLESIP_EXPORT void belle_sip_object_weak_unref(void *obj, belle_sip_object_destroy_notify_t destroy_notify, void *userpointer);
+
+/**
+ * Set object name.
+**/
+BELLESIP_EXPORT void belle_sip_object_set_name(belle_sip_object_t *obj,const char* name);
+
+/**
+ * Get object name.
+**/
+BELLESIP_EXPORT const char* belle_sip_object_get_name(belle_sip_object_t *obj);
+
+/*copy the content of ref object to new object, for the part they have in common in their inheritence diagram*/
+void _belle_sip_object_copy(belle_sip_object_t *newobj, const belle_sip_object_t *ref);
+
+/**
+ * Clone an object.
+ *
+ * This clone function makes a deep copy of all object internal structure, so that the new object and the reference object have no dependencies at all.
+ *
+**/
+BELLESIP_EXPORT belle_sip_object_t *belle_sip_object_clone(const belle_sip_object_t *obj);
+
+/**
+ * Same as #belle_sip_object_clone but with ref count set to 1
+ *
+**/
+belle_sip_object_t *belle_sip_object_clone_and_ref(const belle_sip_object_t *obj);
+
+
+typedef void  (*belle_sip_data_destroy)(void* data);
+typedef void* (*belle_sip_data_clone)(const char* name, void* data);
+
+/**
+ * Add an entry to the object's embedded data store, with the key name specified.
+ * The destroy function is used when the data is cleaned.
+ *
+ * If an entry already exists, the existing data will be cleaned by calling its destroy function and the new data will be placed instead.
+ *
+ * Returns -1 in case of error, 0 in case the insertion was successful, and 1 if existing data was present.
+**/
+BELLESIP_EXPORT int   belle_sip_object_data_set( belle_sip_object_t *obj, const char* name, void* data, belle_sip_data_destroy destroy_func );
+
+/**
+ * Retrieve data that has been stored in the object data store.
+**/
+BELLESIP_EXPORT void* belle_sip_object_data_get( belle_sip_object_t *obj, const char* name );
+
+/**
+  * Return 1 if the key exists in the data store, 0 otherwise
+  **/
+BELLESIP_EXPORT int belle_sip_object_data_exists( const belle_sip_object_t *obj, const char* name );
+
+/**
+  * Destroys the named data associated by the name provided.
+  *
+  * Returns 0 for success, -1 for error
+  **/
+BELLESIP_EXPORT int   belle_sip_object_data_remove( belle_sip_object_t *obj, const char* name);
+
+/**
+  * Retrieve the data from the data store and removes it from the data store, without calling the destructor.
+  * This transfers ownership of the data to the caller, which will be in charge of releasing it.
+  **/
+BELLESIP_EXPORT void* belle_sip_object_data_grab( belle_sip_object_t* obj, const char* name);
+
+/**
+  * Clears all data in the object's storage, invoking the destroy_func when possible
+  **/
+BELLESIP_EXPORT void belle_sip_object_data_clear( belle_sip_object_t* obj );
+
+/**
+  * clones the object's data store to another one, using the provided clone function to clone individual data items.
+  *
+  * The destination data store will be cleaned before pushing the source data into it.
+  * For a merge, use #belle_sip_object_data_merge.
+  * This is equivalent to the following code:
+  *    {
+  *     belle_sip_object_data_clear(dst);
+  *     belle_sip_object_data_merge(src, dst, clone_func);
+  *    }
+  *
+  * Note that providing NULL as a cloning function will simply assign the src object's data to the dst object.
+  *
+  **/
+BELLESIP_EXPORT void belle_sip_object_data_clone( const belle_sip_object_t* src, belle_sip_object_t* dst, belle_sip_data_clone clone_func);
+
+/**
+  * Merge the source data store into the destination data store.
+  *
+  * Same function as #belle_sip_object_data_clone, except the destination data store is not cleared before inserting the source data.
+  * This overwrites common keys, and keeps existing keys.
+  */
+BELLESIP_EXPORT void belle_sip_object_data_merge( const belle_sip_object_t* src, belle_sip_object_t* dst, belle_sip_data_clone clone_func);
+
+/**
+  * Apply a function for each entry in the data store
+  */
+BELLESIP_EXPORT void belle_sip_object_data_foreach( const belle_sip_object_t* obj, void (*apply_func)(const char* key, void* data, void* userdata), void* userdata);
+/**
+ * Returns a string describing the inheritance diagram and implemented interfaces of object obj.
+**/
+char *belle_sip_object_describe(void *obj);
+
+/**
+ * Returns a string describing the inheritance diagram and implemented interfaces of an object given its type name.
+**/
+BELLESIP_EXPORT char *belle_sip_object_describe_type_from_name(const char *name);
+
+BELLESIP_EXPORT void *belle_sip_object_cast(belle_sip_object_t *obj, belle_sip_type_id_t id, const char *castname, const char *file, int fileno);
+
+/**
+ * Returns a newly allocated string representing the object.
+ * WHen the object is a sip header, uri or message, this is the textual representation of the header, uri or message.
+ * This function internally calls belle_sip_object_marshal().
+**/
+BELLESIP_EXPORT char* belle_sip_object_to_string(const void* obj);
+
+/**
+ * Writes a string representation of the object into the supplied buffer.
+ * Same as belle_sip_object_to_string(), but without allocating space for the output string.
+**/
+BELLESIP_EXPORT belle_sip_error_code belle_sip_object_marshal(belle_sip_object_t* obj, char* buff, size_t buff_size, size_t *offset);
+
+/* use BELLE_SIP_OBJECT_IS_INSTANCE_OF macro(), this function is for use by the macro only*/
+BELLESIP_EXPORT int _belle_sip_object_is_instance_of(belle_sip_object_t * obj,belle_sip_type_id_t id);
+
+BELLE_SIP_END_DECLS
+
+#define BELLE_SIP_CAST(obj,_type) 		((_type*)belle_sip_object_cast((belle_sip_object_t *)(obj), _type##_id, #_type, __FILE__, __LINE__))
+
+#define BELLE_SIP_OBJECT(obj) BELLE_SIP_CAST(obj,belle_sip_object_t)
+#define BELLE_SIP_OBJECT_IS_INSTANCE_OF(obj,_type) _belle_sip_object_is_instance_of((belle_sip_object_t*)obj,_type##_id)
+
+#define BELLE_SIP_OBJECT_VPTR(obj,object_type) ((BELLE_SIP_OBJECT_VPTR_TYPE(object_type)*)(((belle_sip_object_t*)obj)->vptr))
+
+/*deprecated*/
+#define BELLE_SIP_IS_INSTANCE_OF(obj,_type)	BELLE_SIP_OBJECT_IS_INSTANCE_OF(obj,_type)
+
+#define belle_sip_object_describe_type(type) \
+	belle_sip_object_describe_type_from_name(#type)
+
+/*
+ * typedefs, macros and functions for interface definition and manipulation.
+ */
+
+#define BELLE_SIP_INTERFACE_ID(_interface) _interface##_id
+
+typedef unsigned int belle_sip_interface_id_t;
+
+BELLE_SIP_BEGIN_DECLS
+
+BELLESIP_EXPORT void *belle_sip_object_interface_cast(belle_sip_object_t *obj, belle_sip_interface_id_t id, const char *castname, const char *file, int fileno);
+
+int belle_sip_object_implements(belle_sip_object_t *obj, belle_sip_interface_id_t id);
+
+BELLE_SIP_END_DECLS
+
+
+#define BELLE_SIP_INTERFACE_METHODS_TYPE(interface_name) methods_##interface_name
+
+#define BELLE_SIP_INTERFACE_CAST(obj,_iface) ((_iface*)belle_sip_object_interface_cast((belle_sip_object_t*)(obj),_iface##_id,#_iface,__FILE__,__LINE__))
+
+#define BELLE_SIP_IMPLEMENTS(obj,_iface)		belle_sip_object_implements((belle_sip_object_t*)obj,_iface##_id)
+
+
+typedef struct belle_sip_interface_desc{
+	belle_sip_interface_id_t id;
+	const char *ifname;
+}belle_sip_interface_desc_t;
+
+#define BELLE_SIP_DECLARE_INTERFACE_BEGIN(interface_name) \
+	typedef struct struct##interface_name interface_name;\
+	typedef struct struct_methods_##interface_name BELLE_SIP_INTERFACE_METHODS_TYPE(interface_name);\
+	struct struct_methods_##interface_name {\
+		belle_sip_interface_desc_t desc;\
+
+
+#define BELLE_SIP_DECLARE_INTERFACE_END };
+
+#define BELLE_SIP_IMPLEMENT_INTERFACE_BEGIN(object_type,interface_name) \
+	static BELLE_SIP_INTERFACE_METHODS_TYPE(interface_name)  methods_##object_type##_##interface_name={\
+		{ BELLE_SIP_INTERFACE_ID(interface_name),\
+		#interface_name },
+
+#define BELLE_SIP_IMPLEMENT_INTERFACE_END };
+
+#define BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(object_type)\
+	static belle_sip_interface_desc_t * object_type##interfaces_table[]={\
+		NULL \
+	}
+
+#define BELLE_SIP_DECLARE_IMPLEMENTED_INTERFACES_1(object_type,iface1) \
+	static belle_sip_interface_desc_t * object_type##interfaces_table[]={\
+		(belle_sip_interface_desc_t*)&methods_##object_type##_##iface1, \
+		NULL \
+	}
+
+#define BELLE_SIP_DECLARE_IMPLEMENTED_INTERFACES_2(object_type,iface1,iface2) \
+	static belle_sip_interface_desc_t * object_type##interfaces_table[]={\
+		(belle_sip_interface_desc_t*)&methods_##object_type##_##iface1, \
+		(belle_sip_interface_desc_t*)&methods_##object_type##_##iface2, \
+		NULL \
+	}
+
+
+/**
+ * Object holding unowned objects - used as a kind of garbage collector for temporary objects.
+**/
+typedef struct belle_sip_object_pool belle_sip_object_pool_t;
+
+BELLE_SIP_BEGIN_DECLS
+
+/**
+ * Push a new object pool for use for creation of new objects.
+ * When no longer needed, this pool can be destroyed with belle_sip_object_unref().
+**/
+BELLESIP_EXPORT belle_sip_object_pool_t * belle_sip_object_pool_push(void);
+
+belle_sip_object_pool_t * belle_sip_object_pool_get_current(void);
+int belle_sip_object_pool_cleanable(belle_sip_object_pool_t *pool);
+void belle_sip_object_pool_clean(belle_sip_object_pool_t *obj);
+
+BELLE_SIP_DECLARE_VPTR(belle_sip_object_t)
+
+BELLE_SIP_END_DECLS
+
+/**
+ * Adding a new type in belle-sip in 5 steps
+ * =========================================
+ *
+ * Let's suppose you want to add an object called belle_sip_something_t
+ * 1) Declare the type in the enum in belle-sip.h:
+ * 	BELLE_SIP_TYPE_ID(belle_sip_something_t)
+ * 2) Declare the api of the new object in .h, including a typedef and a cast macro:
+ * 	typedef struct belle_sip_something belle_sip_something_t;
+ * 	#define BELLE_SIP_SOMETHING(obj)	BELLE_SIP_CAST(obj,belle_sip_something_t)
+ *
+ * 	belle_sip_something_t *belle_sip_something_create(int arg1, int arg2);
+ * 	void belle_sip_something_do_cooking(belle_sip_something_t *obj);
+ *    Do not add any destructor, belle_sip_object_unref() does it for all objects.
+ *
+ * 3) in the c file contaning the object's implementation, define the internal structure for your object.
+ *   The first field of the struct must be the parent type.
+ * 	struct belle_sip_something{
+ * 		belle_sip_object_t base;
+ * 		int myint1;
+ * 		int myint2;
+ * 		char *mychar;
+ * 	};
+ * 4) still in the C file contaning the object's implementation, define a destructor and all functions of its API:
+ *    The destructor must only manage the fields from the type, not the parent.
+ * 	static void belle_sip_something_destroy(belle_sip_something_t *obj){
+ * 		if (obj->mychar) belle_sip_free(obj->mychar);
+ * 	}
+ *
+ * 	belle_sip_something_t *belle_sip_something_create(int arg1, int arg2){
+ * 		belle_sip_something_t *obj=belle_sip_object_new(belle_sip_something_t);
+ * 		obj->myint1=arg1;
+ * 		obj->myint2=arg2;
+ * 		obj->mychar=belle_sip_strdup("Hello world");
+ * 		return obj;
+ * 	}
+ *    Declare the interfaces implemented by the object (to be documented) and instanciate its "vptr", necessary for dynamic casting.
+ * 	BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(belle_sip_something_t);
+ * 	BELLE_SIP_INSTANCIATE_VPTR(belle_sip_something_t, belle_sip_object_t,belle_sip_something_destroy, NULL, NULL,FALSE);
+ *
+ * 5) in .h file included everywhere in the source (typically belle_sip_internal.h), declare the vptr
+ * 	BELLE_SIP_DECLARE_VPTR(belle_sip_dns_srv_t);
+ */
+
+#if defined(__cplusplus) && defined(BELLE_SIP_USE_STL)
+#include <ostream>
+inline   std::ostream&
+operator<<( std::ostream& __os, const belle_sip_object_t* object)
+{
+	char* object_as_string = belle_sip_object_to_string((void*)object);
+	__os << object_as_string;
+	belle_sip_free(object_as_string);
+	return __os;
+}
+#endif
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/parameters.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/parameters.h"
new file mode 100755
index 0000000..dc8f2db
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/parameters.h"
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PARAMETERS_H_
+#define PARAMETERS_H_
+
+#include "belle-sip/utils.h"
+#include "belle-sip/list.h"
+
+BELLE_SIP_BEGIN_DECLS
+
+/***
+ *  parameters
+ *
+ */
+
+belle_sip_parameters_t* belle_sip_parameters_new(void);
+/*
+ * remove all parameters */
+BELLESIP_EXPORT void belle_sip_parameters_clean(belle_sip_parameters_t* params);
+
+/*BELLESIP_EXPORT void belle_sip_parameters_destroy(belle_sip_parameters_t* params);*/
+
+BELLESIP_EXPORT const char*	belle_sip_parameters_get_parameter(const belle_sip_parameters_t* obj,const char* name);
+/*
+ * same as #belle_sip_parameters_get_parameter but name is case insensitive */
+BELLESIP_EXPORT const char*	belle_sip_parameters_get_case_parameter(const belle_sip_parameters_t* params,const char* name);
+
+/**
+ * returns 0 if not found
+ */
+BELLESIP_EXPORT unsigned int belle_sip_parameters_has_parameter(const belle_sip_parameters_t* obj,const char* name);
+
+BELLESIP_EXPORT void	belle_sip_parameters_set_parameter(belle_sip_parameters_t* obj,const char* name,const char* value);
+
+/**
+ * Assign a full set of parameters to the belle_sip_parameters_t object.
+ * Parameters are given as string of key=value pairs separated with semicolons, where value is optional.
+ * @example belle_sip_parameters_set(parameters,"param1=value1;param2;param3=value3");
+**/
+BELLESIP_EXPORT void belle_sip_parameters_set(belle_sip_parameters_t *parameters, const char* params);
+
+BELLESIP_EXPORT const belle_sip_list_t *	belle_sip_parameters_get_parameter_names(const belle_sip_parameters_t* obj);
+
+BELLESIP_EXPORT const belle_sip_list_t *	belle_sip_parameters_get_parameters(const belle_sip_parameters_t* obj);
+
+BELLESIP_EXPORT void	belle_sip_parameters_remove_parameter(belle_sip_parameters_t* obj,const char* name);
+
+BELLESIP_EXPORT belle_sip_error_code belle_sip_parameters_marshal(const belle_sip_parameters_t* obj, char* buff, size_t buff_size, size_t *offset);
+
+BELLESIP_EXPORT void belle_sip_parameters_copy_parameters_from(belle_sip_parameters_t *params, const belle_sip_parameters_t *orig);
+
+#define BELLE_SIP_PARAMETERS(obj) BELLE_SIP_CAST(obj,belle_sip_parameters_t)
+
+BELLE_SIP_END_DECLS
+
+#endif /*PARAMETERS_H_*/
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/provider.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/provider.h"
new file mode 100755
index 0000000..1d1fda3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/provider.h"
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_sip_provider_h
+#define belle_sip_provider_h
+
+#define BELLE_SIP_BRANCH_MAGIC_COOKIE "z9hG4bK"
+
+BELLE_SIP_BEGIN_DECLS
+
+BELLESIP_EXPORT belle_sip_uri_t *belle_sip_provider_create_inbound_record_route(belle_sip_provider_t *p, belle_sip_request_t *req);
+
+BELLESIP_EXPORT int belle_sip_provider_is_us(belle_sip_provider_t *p, belle_sip_uri_t*);
+
+BELLESIP_EXPORT int belle_sip_provider_add_listening_point(belle_sip_provider_t *p, belle_sip_listening_point_t *lp);
+
+BELLESIP_EXPORT void belle_sip_provider_remove_listening_point(belle_sip_provider_t *p, belle_sip_listening_point_t *lp);
+
+BELLESIP_EXPORT belle_sip_listening_point_t *belle_sip_provider_get_listening_point(belle_sip_provider_t *p, const char *transport);
+
+BELLESIP_EXPORT const belle_sip_list_t *belle_sip_provider_get_listening_points(belle_sip_provider_t *p);
+
+BELLESIP_EXPORT void belle_sip_provider_add_sip_listener(belle_sip_provider_t *p, belle_sip_listener_t *l);
+
+BELLESIP_EXPORT void belle_sip_provider_remove_sip_listener(belle_sip_provider_t *p, belle_sip_listener_t *l);
+
+BELLESIP_EXPORT belle_sip_header_call_id_t * belle_sip_provider_create_call_id(const belle_sip_provider_t *prov);
+
+BELLESIP_EXPORT belle_sip_dialog_t *belle_sip_provider_create_dialog(belle_sip_provider_t *prov, belle_sip_transaction_t *t);
+
+BELLESIP_EXPORT belle_sip_client_transaction_t *belle_sip_provider_create_client_transaction(belle_sip_provider_t *p, belle_sip_request_t *req);
+
+BELLESIP_EXPORT belle_sip_server_transaction_t *belle_sip_provider_create_server_transaction(belle_sip_provider_t *p, belle_sip_request_t *req);
+
+BELLESIP_EXPORT belle_sip_stack_t *belle_sip_provider_get_sip_stack(belle_sip_provider_t *p);
+
+BELLESIP_EXPORT void belle_sip_provider_send_request(belle_sip_provider_t *p, belle_sip_request_t *req);
+
+BELLESIP_EXPORT void belle_sip_provider_send_response(belle_sip_provider_t *p, belle_sip_response_t *resp);
+
+BELLESIP_EXPORT void belle_sip_provider_clean_channels(belle_sip_provider_t *p);
+
+/**
+ * Add auth info to the request if found
+ * @param p object
+ * @param request to be updated
+ * @param resp response to take authentication values from, might be NULL
+ * @param from_uri optional - an uri to use instead of the from of the request, which can be anonymous.
+ * @param auth_infos optional - A newly allocated belle_sip_auth_info_t object is added to this list. These object contains useful information like realm and username.
+ * @param realm optional - If an outbound proxy realm is used, nounce can be reused from previous request to avoid re-authentication.
+ * @returns 0 in case of success,
+ *
+ **/
+BELLESIP_EXPORT int belle_sip_provider_add_authorization(belle_sip_provider_t *p, belle_sip_request_t* request,belle_sip_response_t *resp, belle_sip_uri_t *from_uri, belle_sip_list_t** auth_infos, const char* realm);
+
+/**
+ * Provides access to a specific dialog
+ * @param prov object
+ * @param call_if of the dialog
+ * @param local_tag of the dialog
+ * @param remote_tag of the dialog
+ * @returns dialog corresponding to this parameter or NULL if not found
+ *
+ **/
+BELLESIP_EXPORT belle_sip_dialog_t* belle_sip_provider_find_dialog(const belle_sip_provider_t *prov, const char* call_id,const char* local_tag,const char* remote_tag);
+
+/**
+ * Enable rport in via header. Enabled by default
+ * @param prov
+ * @return enable 0 to disable
+**/
+BELLESIP_EXPORT void belle_sip_provider_enable_rport(belle_sip_provider_t *prov, int enable);
+/**
+ * get Enable rport in via header. Enabled by default
+ * @param prov
+ * @param enable 0 to disable
+**/
+BELLESIP_EXPORT int belle_sip_provider_is_rport_enabled(belle_sip_provider_t *prov);
+
+
+/**
+ * Enable discovery of NAT's public address and port during SIP exchanges.
+ * When activated, automatic contacts ( see belle_sip_header_contact_set_automatic() )
+ * will use discovered public IP address and port (if any) instead of local ones.
+ * NAT public address and port are discovered using received and rport parameters in via header of responses.
+ * As a result, disabling rport ( see  belle_sip_provider_enable_rport() ) will also break this feature.
+**/
+BELLESIP_EXPORT void belle_sip_provider_enable_nat_helper(belle_sip_provider_t *prov, int enabled);
+
+/**
+ * Returns if nat helper behavior is enabled.
+ * @see belle_sip_provider_enable_nat_helper()
+**/
+BELLESIP_EXPORT int belle_sip_provider_nat_helper_enabled(const belle_sip_provider_t *prov);
+
+
+/*
+ * Following functions are used for tests ONLY
+ */
+
+/**
+ * Can be used to simulate network recv error, for tests.
+ * @param prov
+ * @param recv_error if <=0, will cause channel error to be reported
+**/
+BELLESIP_EXPORT void belle_sip_provider_set_recv_error(belle_sip_provider_t *prov, int recv_error);
+
+/**
+ * Can be used to unconditionally answer to incoming sip messages. By  default 480 is answered.
+ * Can be enhanced by a new method belle_sip_provider_set_unconditional_answer to allows user to provide answer code
+ * @param prov
+ * @param enable 0 to disable
+**/
+BELLESIP_EXPORT void belle_sip_provider_enable_unconditional_answer(belle_sip_provider_t *prov, int enable);
+
+/**
+ * Can be used to choose unconditionally answer to incoming sip messages.
+ * use belle_sip_provider_enable_unconditional_answer to enable/disable
+ * @param prov
+ * @param code 0 to sip response code
+ **/
+BELLESIP_EXPORT void belle_sip_provider_set_unconditional_answer(belle_sip_provider_t *prov, unsigned short code);
+
+/*
+ * End of test features.
+ */
+
+
+BELLE_SIP_END_DECLS
+
+#define BELLE_SIP_PROVIDER(obj) BELLE_SIP_CAST(obj,belle_sip_provider_t)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/refresher.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/refresher.h"
new file mode 100755
index 0000000..194ce79
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/refresher.h"
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef REFRESHER_HELPER_H_
+#define REFRESHER_HELPER_H_
+
+#define BELLE_SIP_REFRESHER_REUSE_EXPIRES -1
+
+BELLE_SIP_BEGIN_DECLS
+
+typedef struct belle_sip_refresher belle_sip_refresher_t;
+/**
+ * Refresher listener invoked every time a refresh action is performed
+ * @param refresher corresponding refresher object.
+ * @param user_pointer user pointer
+ * @param status_code status code for the last refresh action
+ * @param reason_phrase
+ * @param will_retry a boolean indicating wether the refresher is going to retry the request automatically.
+ * */
+typedef void (*belle_sip_refresher_listener_t) (belle_sip_refresher_t* refresher
+								,void* user_pointer
+								,unsigned int status_code
+								,const char* reason_phrase, int will_retry);
+
+/**
+ * add a refresher listener
+ */
+BELLESIP_EXPORT void belle_sip_refresher_set_listener(belle_sip_refresher_t* refresher, belle_sip_refresher_listener_t listener,void* user_pointer);
+
+/**
+ * start the refresher
+ */
+int belle_sip_refresher_start(belle_sip_refresher_t* refresher);
+/**
+ * stop refresher.
+ * If a transaction is pending, it will be terminated.
+ */
+BELLESIP_EXPORT void belle_sip_refresher_stop(belle_sip_refresher_t* refresher);
+
+/**
+ * Manually initiate a new transaction .
+ * @param refresher object
+ * @param expires #BELLE_SIP_REFRESHER_REUSE_EXPIRES means value extracted from the transaction
+ * @return 0 if succeed
+ */
+BELLESIP_EXPORT int belle_sip_refresher_refresh(belle_sip_refresher_t* refresher,int expires);
+/**
+ * returns current expires value;
+ */
+BELLESIP_EXPORT int belle_sip_refresher_get_expires(const belle_sip_refresher_t* refresher);
+
+/**
+ * returns  delay in ms after which the refresher will retry in case of recoverable error (I.E 408, 480, 503, 504, io error);
+ */
+BELLESIP_EXPORT int belle_sip_refresher_get_retry_after(const belle_sip_refresher_t* refresher);
+
+/**
+ * Delay in ms after which the refresher will retry in case of recoverable error (I.E 408, 480, 503, 504, io error);
+ */
+BELLESIP_EXPORT void belle_sip_refresher_set_retry_after(belle_sip_refresher_t* refresher, int delay_ms);
+
+/**
+ * returns  realm of the outbound proxy used for authentication, if any
+ */
+BELLESIP_EXPORT const char* belle_sip_refresher_get_realm(const belle_sip_refresher_t* refresher);
+
+/**
+ * Realm of the outbound proxy used for authentication, if any
+ */
+BELLESIP_EXPORT void belle_sip_refresher_set_realm(belle_sip_refresher_t* refresher, const char* realm);
+
+/**
+ * get current client transaction
+ * @param refresher object
+ * @return transaction
+ */
+BELLESIP_EXPORT const belle_sip_client_transaction_t* belle_sip_refresher_get_transaction(const belle_sip_refresher_t* refresher);
+
+/**
+ * Get current list of auth info if any. Contains the list of filled #belle_sip_auth_event_t in case of a 401 or 407 is repported to the #belle_sip_refresher_listener_t  ;
+ * @param refresher object
+ * @return list of #belle_sip_auth_info_t
+ */
+BELLESIP_EXPORT const belle_sip_list_t* belle_sip_refresher_get_auth_events(const belle_sip_refresher_t* refresher);
+
+/**
+ * Enable manual mode: only belle_sip_refresher_refresh() called by application will cause requests to be resubmitted.
+**/
+BELLESIP_EXPORT void belle_sip_refresher_enable_manual_mode(belle_sip_refresher_t *refresher, int enabled);
+
+/**
+ * Retrieve current local address used by the underlying refresher's channel.
+**/
+BELLESIP_EXPORT const char * belle_sip_refresher_get_local_address(belle_sip_refresher_t* refresher, int *port);
+
+/**
+ * Retrieve current public address used by the underlying refresher's channel.
+**/
+BELLESIP_EXPORT const char * belle_sip_refresher_get_public_address(belle_sip_refresher_t* refresher, int *port);
+/**
+ * Retrieve last know contact header if known. Only available after a successful registration.
+**/
+BELLESIP_EXPORT belle_sip_header_contact_t* belle_sip_refresher_get_contact(const belle_sip_refresher_t* refresher);
+
+BELLE_SIP_END_DECLS
+
+#endif /* REFRESHER_HELPER_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/resolver.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/resolver.h"
new file mode 100755
index 0000000..b16e692
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/resolver.h"
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_sip_resolver_h
+#define belle_sip_resolver_h
+
+typedef struct belle_sip_dns_srv belle_sip_dns_srv_t;
+#define BELLE_SIP_DNS_SRV(obj) BELLE_SIP_CAST(obj,belle_sip_dns_srv_t)
+
+typedef struct belle_sip_resolver_context belle_sip_resolver_context_t;
+#define BELLE_SIP_RESOLVER_CONTEXT(obj) BELLE_SIP_CAST(obj,belle_sip_resolver_context_t)
+
+typedef struct belle_sip_resolver_results belle_sip_resolver_results_t;
+#define BELLE_SIP_RESOLVER_RESULTS(obj) BELLE_SIP_CAST(obj,belle_sip_resolver_results_t)
+
+/**
+ * Callback prototype for asynchronous DNS SRV resolution.
+ * The srv_list contains struct dns_srv elements that must be taken and (possibly later) freed by the callee, using belle_sip_free().
+ */
+typedef void (*belle_sip_resolver_srv_callback_t)(void *data, const char *name, belle_sip_list_t *srv_list, uint32_t ttl);
+
+/**
+ * Callback prototype for asynchronous DNS A and AAAA resolution.
+ * The 'results' object must be acquired (ref'd) in order for being accessed outside of the callback.
+ * The results object provides SRV records list and addrinfo list.
+**/
+typedef void (*belle_sip_resolver_callback_t)(void *data, belle_sip_resolver_results_t *results);
+
+
+BELLE_SIP_BEGIN_DECLS
+
+BELLESIP_EXPORT const char *belle_sip_dns_srv_get_target(const belle_sip_dns_srv_t *obj);
+
+BELLESIP_EXPORT unsigned short belle_sip_dns_srv_get_priority(const belle_sip_dns_srv_t *obj);
+
+BELLESIP_EXPORT unsigned short belle_sip_dns_srv_get_weight(const belle_sip_dns_srv_t *obj);
+
+BELLESIP_EXPORT unsigned short belle_sip_dns_srv_get_port(const belle_sip_dns_srv_t *obj);
+
+/**
+ * Find the belle_sip_dns_srv_t object associated with a particular addrinfo.
+ * The srv_list and the addrinfo must be the ones given by the belle_sip_resolver_callback_t callback invoked consecutively to a call
+ * to belle_sip_stack_resolve().
+**/
+BELLESIP_EXPORT const belle_sip_dns_srv_t * belle_sip_resolver_results_get_srv_from_addrinfo(const belle_sip_resolver_results_t *obj, const struct addrinfo *ai);
+
+BELLESIP_EXPORT const bctbx_list_t *belle_sip_resolver_results_get_srv_records(const belle_sip_resolver_results_t *obj);
+
+BELLESIP_EXPORT const struct addrinfo *belle_sip_resolver_results_get_addrinfos(const belle_sip_resolver_results_t *obj);
+
+BELLESIP_EXPORT int belle_sip_resolver_results_get_ttl(const belle_sip_resolver_results_t *obj);
+
+BELLESIP_EXPORT const char * belle_sip_resolver_results_get_name(const belle_sip_resolver_results_t *obj);
+
+/**
+ * Asynchronously performs DNS SRV followed A/AAAA query. Automatically fallbacks to A/AAAA if SRV isn't found.
+ * @param stack the belle_sip_stack_t, used to schedule asynchronous execution.
+ * @param service the queried service ("sip", "stun", "turn"...)
+ * @param transport the queried transport ("udp", "tcp", "tls")
+ * @param name the SIP domain name
+ * @param port a port that will be filled in the addrinfo list returned by the callback, for the case where no SRV records are found.
+ * @param family address family expected in the addrinfo result list. AF_INET or AF_INET6. If AF_INET6 is used but no IPv6 records are found, the IPv4 addresses
+ * will be returned as IPv6 with v4 mapping (AI_V4MAPPED).
+ * @param cb a callback function that will be called to notify the results.
+ * @param data a user pointer passed through the callback as first argument.
+ * @return a #belle_sip_resolver_context_t that can be used to cancel the resolution if needed. The context must have been ref'd with belle_sip_object_ref().
+**/
+BELLESIP_EXPORT belle_sip_resolver_context_t * belle_sip_stack_resolve(belle_sip_stack_t *stack, const char *service, const char *transport, const char *name, int port, int family,
+belle_sip_resolver_callback_t cb, void *data);
+
+/**
+ * Asynchronously performs DNS A or AAAA query.
+ * @param stack the belle_sip_stack_t, used to schedule asynchronous execution.
+ * @param name the SIP domain name
+ * @param port a port that will be filled in the addrinfo list returned by the callback, for the case where no SRV records are found.
+ * @param family address family expected in the addrinfo result list. AF_INET or AF_INET6. If AF_INET6 is used but no IPv4 records are found, the IPv4 addresses
+ * will be returned as IPv6 with v4 mapping (AI_V4MAPPED).
+ * @param cb a callback function that will be called to notify the results.
+ * @param data a user pointer passed through the callback as first argument.
+ * @return a #belle_sip_resolver_context_t that can be used to cancel the resolution if needed. The context must have been ref'd with belle_sip_object_ref().
+**/
+BELLESIP_EXPORT belle_sip_resolver_context_t * belle_sip_stack_resolve_a(belle_sip_stack_t *stack, const char *name, int port, int family, belle_sip_resolver_callback_t cb, void *data);
+
+/**
+ * Asynchronously performs DNS SRV query.
+ * @return a #belle_sip_resolver_context_t that can be used to cancel the resolution if needed. The context must have been ref'd with belle_sip_object_ref().
+**/
+BELLESIP_EXPORT belle_sip_resolver_context_t * belle_sip_stack_resolve_srv(belle_sip_stack_t *stack, const char *service, const char *transport, const char *name, belle_sip_resolver_srv_callback_t cb, void *data);
+
+/**
+ * Cancel a pending asynchronous DNS query. The context is unref'd automatically, as a result the context shall no longer be used after this call.
+ * If the query is already performed, cancellation has no effect, but context is unref'd anyway.
+ **/
+BELLESIP_EXPORT void belle_sip_resolver_context_cancel(belle_sip_resolver_context_t *ctx);
+
+/**
+ * Lookups the source address from local interface that can be used to connect to a destination address.
+ * local_port is only used to be assigned into the result source address.
+ * This function always puts something in src and srclen (the loopback address) even if anything fails.
+ * The return code is 0 if successful, or -errno if an error was encoutered. Typical error is -ENETUNREACH when IPv6 network is not reachable.
+**/
+BELLESIP_EXPORT int belle_sip_get_src_addr_for(const struct sockaddr *dest, socklen_t destlen, struct sockaddr *src, socklen_t *srclen, int local_port);
+
+
+BELLE_SIP_END_DECLS
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/sip-uri.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/sip-uri.h"
new file mode 100755
index 0000000..4775add
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/sip-uri.h"
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_URI_H_
+#define BELLE_SIP_URI_H_
+
+#include "belle-sip/defs.h"
+#include "belle-sip/list.h"
+#include "belle-sip/utils.h"
+#include "belle-sip/types.h"
+
+BELLE_SIP_BEGIN_DECLS
+
+/**
+ *
+ */
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_uri_new(void);
+
+/**
+ *
+ */
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_uri_parse (const char* uri) ;
+
+/**
+ *
+ */
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_fast_uri_parse (const char* uri) ;
+
+/**
+ * same as belle_sip_uri_parse but with much less checks
+ */
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_fast_uri_parse (const char* uri) ;
+/**
+ *
+ */
+BELLESIP_EXPORT belle_sip_uri_t* belle_sip_uri_create (const char* username,const char* host) ;
+
+
+/**
+ *	Returns the value of the named header, or null if it is not set.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_sip_uri_get_header(const belle_sip_uri_t* uri,const char* name);
+
+
+/**
+ *	remove all headers
+ *
+ */
+BELLESIP_EXPORT void belle_sip_uri_headers_clean(belle_sip_uri_t* uri);
+
+
+/**
+ * Returns an Iterator over the const char*names of all headers present in this SipURI.
+ *
+ */
+BELLESIP_EXPORT const belle_sip_list_t*	belle_sip_uri_get_header_names(const belle_sip_uri_t* uri) ;
+/**
+ * 	          Returns the host part of this SipURI.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_sip_uri_get_host(const belle_sip_uri_t* uri) ;
+/**
+ * 	          Returns the value of the maddr parameter, or null if this is not set.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_sip_uri_get_maddr_param(const belle_sip_uri_t* uri) ;
+/**
+ *	          Returns the value of the method parameter, or null if this is not set.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_sip_uri_get_method_param(const belle_sip_uri_t* uri) ;
+/**
+ *	          Returns the port part of this SipURI.
+ *
+ */
+BELLESIP_EXPORT int	belle_sip_uri_get_port(const belle_sip_uri_t* uri) ;
+/**
+ * Returns the port of the uri, if not specified in the uri returns the well known port according to the transport.
+**/
+BELLESIP_EXPORT int belle_sip_uri_get_listening_port(const belle_sip_uri_t *uri);
+/**
+ * 	          Returns the value of the "transport" parameter, or null if this is not set.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_sip_uri_get_transport_param(const belle_sip_uri_t* uri) ;
+/**
+ * 	          Returns the value of the "ttl" parameter, or -1 if this is not set.
+ *
+ */
+BELLESIP_EXPORT int	belle_sip_uri_get_ttl_param(const belle_sip_uri_t* uri) ;
+/**
+ * 	          Returns the user part of this SipURI.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_sip_uri_get_user(const belle_sip_uri_t* uri) ;
+/**
+ * 	          Returns the value of the userParam, or null if this is not set.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_sip_uri_get_user_param(const belle_sip_uri_t* uri) ;
+/**
+ * 	          Gets user password of SipURI, or null if it is not set.
+ *
+ */
+BELLESIP_EXPORT const char*	belle_sip_uri_get_user_password(const belle_sip_uri_t* uri) ;
+/**
+ *	          Returns whether the the lr parameter is set.
+ *
+ */
+BELLESIP_EXPORT unsigned int	belle_sip_uri_has_lr_param(const belle_sip_uri_t* uri) ;
+/**
+ *
+ * 	          Returns true if this SipURI is secure i.e. if this SipURI represents a sips URI.
+ *
+ */
+BELLESIP_EXPORT unsigned int	belle_sip_uri_is_secure(const belle_sip_uri_t* uri) ;
+
+/**
+ * 	          Sets the value of the specified header fields to be included in a request constructed from the URI.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_header(belle_sip_uri_t* uri,const char*name, const char*value) ;
+
+/**
+ * Removes specified header from uri.
+**/
+BELLESIP_EXPORT void belle_sip_uri_remove_header(belle_sip_uri_t *uri, const char *name);
+
+/**
+ * 	          Removes the port part of this SipURI.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_remove_port(belle_sip_uri_t* uri) ;
+/**
+ * 	          Set the host part of this SipURI to the newly supplied host parameter.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_host(belle_sip_uri_t* uri,const char*host) ;
+/**
+ * 	          Sets the value of the lr parameter of this SipURI.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_lr_param(belle_sip_uri_t* uri,unsigned int param) ;
+/**
+ *          Sets the value of the maddr parameter of this SipURI.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_maddr_param(belle_sip_uri_t* uri,const char*mAddr) ;
+/**
+ *	          Sets the value of the method parameter.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_method_param(belle_sip_uri_t* uri,const char*method) ;
+/**
+ * 	          Set the port part of this SipURI to the newly supplied port parameter.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_port(belle_sip_uri_t* uri, int port) ;
+/**
+ * 	          Sets the scheme of this URI to sip or sips depending on whether the argument is true or false.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_secure(belle_sip_uri_t* uri,unsigned int secure) ;
+/**
+ * 	          Sets the value of the "transport" parameter.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_transport_param(belle_sip_uri_t* uri,const char*transport) ;
+/**
+ *  	          Sets the value of the ttl parameter.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_ttl_param(belle_sip_uri_t* uri,int ttl) ;
+/**
+ *  	          Sets the user of SipURI.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_user(belle_sip_uri_t* uri,const char*user) ;
+/**
+ * 	          Sets the value of the user parameter.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_user_param(belle_sip_uri_t* uri,const char*userParam) ;
+/**
+ * 	          Sets the user password associated with the user of SipURI.
+ *
+ */
+BELLESIP_EXPORT void	belle_sip_uri_set_user_password(belle_sip_uri_t* uri,const char*userPassword) ;
+
+/**
+ * 	          This method returns the URI as a string.
+ *
+ */
+BELLESIP_EXPORT char*	belle_sip_uri_to_string(const belle_sip_uri_t* uri) ;
+
+belle_sip_error_code belle_sip_uri_marshal(const belle_sip_uri_t* uri, char* buff, size_t buff_size, size_t *offset);
+
+#define BELLE_SIP_URI(obj) BELLE_SIP_CAST(obj,belle_sip_uri_t)
+
+/**define URI equality as using comparison rules from RFC3261 section 19.1.4
+ * @param belle_sip_uri_t* uri_a
+ * @param belle_sip_uri_t* uri_a
+ * @return 0 if not matched.
+ *
+ * */
+BELLESIP_EXPORT int belle_sip_uri_equals(const belle_sip_uri_t* uri_a,const belle_sip_uri_t* uri_b);
+
+/**define URI equality as belle_sip_uri_equals but allows URI omitting for the port
+ * @param belle_sip_uri_t* uri_a
+ * @param belle_sip_uri_t* uri_a
+ * @return 0 if not matched.
+ *
+ * */
+BELLESIP_EXPORT int belle_sip_uri_equals_with_uri_omitting(const belle_sip_uri_t* uri_a,const belle_sip_uri_t* uri_b);
+
+/**
+ * returns 0 if uri does follows components requirement for being a request uri
+ * */
+BELLESIP_EXPORT int belle_sip_uri_check_components_from_request_uri(const belle_sip_uri_t* uri);
+
+/**
+ * returns 0 if uri does follows components requirement for a given method/header
+ */
+BELLESIP_EXPORT int belle_sip_uri_check_components_from_context(const belle_sip_uri_t* uri,const char* method,const char* header_name);
+BELLE_SIP_END_DECLS
+#ifndef BELLE_SIP_USE_STL
+#define BELLE_SIP_USE_STL 1
+#endif
+
+#if __cplusplus >= 201103L && BELLE_SIP_USE_STL
+#include <ostream>
+inline   std::ostream&
+operator<<( std::ostream& __os, const belle_sip_uri_t* uri)
+{
+	char* uri_as_string = belle_sip_uri_to_string(uri);
+	__os << uri_as_string;
+	belle_sip_free(uri_as_string);
+	return __os;
+}
+namespace std {
+	template <> struct hash<const belle_sip_uri_t*> {
+		size_t operator()(const belle_sip_uri_t *x ) const {
+			hash<string> H;
+			size_t h=0;
+			if (belle_sip_uri_get_user(x))
+				h = H(belle_sip_uri_get_user(x));
+			if (belle_sip_uri_get_host(x))
+				h ^=H(belle_sip_uri_get_host(x));
+			if (belle_sip_uri_get_port(x)>0) {
+				std::hash<int> H2;
+				h ^=H2(belle_sip_uri_get_port(x));
+			}
+			if (belle_sip_uri_get_transport_param(x)) {
+				h ^=H(belle_sip_uri_get_transport_param(x));
+			}
+			if (belle_sip_uri_is_secure(x))
+				h+=1;
+
+			return h;
+		}
+	};
+}
+
+#include <functional>
+
+namespace bellesip {
+
+struct UriComparator : public std::binary_function<belle_sip_uri_t*, belle_sip_uri_t*, bool> {
+	bool operator()(const belle_sip_uri_t* lhs, const belle_sip_uri_t* rhs) const {
+		return belle_sip_uri_equals(lhs,rhs);
+	}
+};
+}
+
+
+
+#endif
+
+#endif  /*BELLE_SIP_URI_H_*/
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/sipstack.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/sipstack.h"
new file mode 100755
index 0000000..52b5b94
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/sipstack.h"
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef belle_sip_stack_h
+#define belle_sip_stack_h
+
+struct belle_sip_timer_config{
+	int T1;
+	int T2;
+	int T3;
+	int T4;
+};
+
+typedef struct belle_sip_timer_config belle_sip_timer_config_t;
+
+BELLE_SIP_BEGIN_DECLS
+
+BELLESIP_EXPORT belle_sip_stack_t * belle_sip_stack_new(const char *properties);
+
+BELLESIP_EXPORT belle_sip_listening_point_t *belle_sip_stack_create_listening_point(belle_sip_stack_t *s, const char *ipaddress, int port, const char *transport);
+
+BELLESIP_EXPORT void belle_sip_stack_delete_listening_point(belle_sip_stack_t *s, belle_sip_listening_point_t *lp);
+
+BELLESIP_EXPORT belle_sip_provider_t *belle_sip_stack_create_provider(belle_sip_stack_t *s, belle_sip_listening_point_t *lp);
+
+BELLESIP_EXPORT belle_http_provider_t * belle_sip_stack_create_http_provider(belle_sip_stack_t *s, const char *bind_ip);
+
+BELLESIP_EXPORT belle_sip_main_loop_t* belle_sip_stack_get_main_loop(belle_sip_stack_t *stack);
+
+BELLESIP_EXPORT void belle_sip_stack_main(belle_sip_stack_t *stack);
+
+BELLESIP_EXPORT void belle_sip_stack_sleep(belle_sip_stack_t *stack, unsigned int milliseconds);
+
+/*the transport timeout is typically the maximum time given for making a connection*/
+BELLESIP_EXPORT void belle_sip_stack_set_transport_timeout(belle_sip_stack_t *stack, int timeout_ms);
+
+BELLESIP_EXPORT int belle_sip_stack_get_transport_timeout(const belle_sip_stack_t *stack);
+
+BELLESIP_EXPORT int belle_sip_stack_get_dns_timeout(const belle_sip_stack_t *stack);
+
+BELLESIP_EXPORT void belle_sip_stack_set_dns_timeout(belle_sip_stack_t *stack, int timeout);
+
+BELLESIP_EXPORT unsigned char belle_sip_stack_dns_srv_enabled(const belle_sip_stack_t *stack);
+
+BELLESIP_EXPORT void belle_sip_stack_enable_dns_srv(belle_sip_stack_t *stack, unsigned char enable);
+
+BELLESIP_EXPORT unsigned char belle_sip_stack_dns_search_enabled(const belle_sip_stack_t *stack);
+
+BELLESIP_EXPORT void belle_sip_stack_enable_dns_search(belle_sip_stack_t *stack, unsigned char enable);
+
+/**
+ * Override system's DNS servers used for DNS resolving by app-supplied list of dns servers.
+ * @param stack the stack
+ * @param servers a list of char*. It is copied internally.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_dns_servers(belle_sip_stack_t *stack, const belle_sip_list_t *servers);
+
+
+/**
+ * Get the additional DNS hosts file.
+ * @return The path to the additional DNS hosts file.
+**/
+BELLESIP_EXPORT const char * belle_sip_stack_get_dns_user_hosts_file(const belle_sip_stack_t *stack);
+
+/**
+ * Can be used to load an additional DNS hosts file for tests.
+ * @param stack
+ * @param hosts_file The path to the additional DNS hosts file to load.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_dns_user_hosts_file(belle_sip_stack_t *stack, const char *hosts_file);
+
+
+/**
+ * Get the overriding DNS resolv.conf file.
+ * @return The path to the overriding DNS resolv.conf file.
+**/
+BELLESIP_EXPORT const char * belle_sip_stack_get_dns_resolv_conf_file(const belle_sip_stack_t *stack);
+
+/**
+ * Can be used to load an overriding DNS resolv.conf file for tests.
+ * @param stack
+ * @param hosts_file The path to the overriding DNS resolv.conf file to load.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_dns_resolv_conf_file(belle_sip_stack_t *stack, const char *hosts_file);
+
+/**
+ * Returns the time interval in seconds after which a connection must be closed when inactive.
+**/
+BELLESIP_EXPORT int belle_sip_stack_get_inactive_transport_timeout(const belle_sip_stack_t *stack);
+
+/**
+ * Sets the time interval in seconds after which a connection must be closed when inactive.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_inactive_transport_timeout(belle_sip_stack_t *stack, int seconds);
+
+
+/**
+ * Set the default dscp value to be used for all SIP sockets created and used in the stack.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_default_dscp(belle_sip_stack_t *stack, int dscp);
+
+/**
+ * Get the default dscp value to be used for all SIP sockets created and used in the stack.
+**/
+BELLESIP_EXPORT int belle_sip_stack_get_default_dscp(belle_sip_stack_t *stack);
+
+
+/**
+ * Returns TRUE if TLS support has been compiled into, FALSE otherwise.
+**/
+BELLESIP_EXPORT int belle_sip_stack_tls_available(belle_sip_stack_t *stack);
+
+/**
+ * Returns TRUE if the content encoding support has been compiled in, FALSE otherwise.
+**/
+BELLESIP_EXPORT int belle_sip_stack_content_encoding_available(belle_sip_stack_t *stack, const char *content_encoding);
+
+/*
+ * returns timer config for this stack
+**/
+BELLESIP_EXPORT const belle_sip_timer_config_t *belle_sip_stack_get_timer_config(const belle_sip_stack_t *stack);
+
+/*
+ *
+ * set sip timer config to be used for this stack
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_timer_config(belle_sip_stack_t *stack, const belle_sip_timer_config_t *timer_config);
+
+BELLESIP_EXPORT void belle_sip_stack_set_http_proxy_host(belle_sip_stack_t *stack, const char* proxy_addr);
+BELLESIP_EXPORT void belle_sip_stack_set_http_proxy_port(belle_sip_stack_t *stack, int port);
+BELLESIP_EXPORT const char *belle_sip_stack_get_http_proxy_host(const belle_sip_stack_t *stack);
+BELLESIP_EXPORT int belle_sip_stack_get_http_proxy_port(const belle_sip_stack_t *stack);
+
+/**
+ * Enable the reconnection to the primary server when it is up again as soon as possible.
+ * When activated, instead of closing if the current server is not in the refreshed priority ordered servers' list
+ * the bellesip channel will close if the current server is not the first server of this list.
+ * As a result, it will try to reconnect to the server with the highest priority if it is not the case when records
+ * are expiring.
+ * @param prov
+ * @param enabled 0 to disable
+**/
+BELLESIP_EXPORT void belle_sip_stack_enable_reconnect_to_primary_asap(belle_sip_stack_t *stack, int enabled);
+
+/**
+ * Returns if the reconnection to the primary server is enabled.
+ * @param prov
+ * @see belle_sip_provider_enable_reconnect_to_primary_asap()
+**/
+BELLESIP_EXPORT int belle_sip_stack_reconnect_to_primary_asap_enabled(const belle_sip_stack_t *stack);
+
+
+/*
+ * The following functions are for testing (non regression tests) ONLY
+ */
+
+/**
+ * Can be used to simulate network transmission delays, for tests.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_tx_delay(belle_sip_stack_t *stack, int delay_ms);
+/**
+ * Can be used to simulate network sending error, for tests.
+ * @param stack
+ * @param send_error if <0, will cause channel error to be reported
+**/
+
+BELLESIP_EXPORT void belle_sip_stack_set_send_error(belle_sip_stack_t *stack, int send_error);
+
+/**
+ * Can be used to simulate network transmission delays, for tests.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_resolver_tx_delay(belle_sip_stack_t *stack, int delay_ms);
+
+/**
+ * Can be used to simulate network sending error, for tests.
+ * @param stack
+ * @param send_error if <0, will cause the resolver to fail with this error code.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_resolver_send_error(belle_sip_stack_t *stack, int send_error);
+
+
+/**
+ * Requests TCP/TLS client connection to bind a on specific port. This is for test ONLY.
+**/
+BELLESIP_EXPORT void belle_sip_stack_set_client_bind_port(belle_sip_stack_t *stack, int port);
+
+
+/*
+ * End of test functions.
+ */
+
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/transaction.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/transaction.h"
new file mode 100755
index 0000000..7f27edd
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/transaction.h"
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_TRANSACTION_H
+#define BELLE_SIP_TRANSACTION_H
+
+typedef enum belle_sip_transaction_state{
+	BELLE_SIP_TRANSACTION_INIT,
+	BELLE_SIP_TRANSACTION_CALLING,
+	BELLE_SIP_TRANSACTION_COMPLETED,
+	BELLE_SIP_TRANSACTION_CONFIRMED,
+	BELLE_SIP_TRANSACTION_ACCEPTED, /*<for Invite transaction, introduced by RFC6026, fixing bugs in RFC3261*/
+	BELLE_SIP_TRANSACTION_PROCEEDING,
+	BELLE_SIP_TRANSACTION_TRYING,
+	BELLE_SIP_TRANSACTION_TERMINATED
+}belle_sip_transaction_state_t;
+
+BELLE_SIP_BEGIN_DECLS
+
+BELLESIP_EXPORT const char *belle_sip_transaction_state_to_string(const belle_sip_transaction_state_t state);
+/*
+ * Transient states are:
+ * 	<br> BELLE_SIP_TRANSACTION_INIT,
+ *	<br> BELLE_SIP_TRANSACTION_CALLING,
+ *	<br> BELLE_SIP_TRANSACTION_PROCEEDING,
+ *	<br> BELLE_SIP_TRANSACTION_TRYING,
+ * @param state
+ * @return 0 if not transient
+ * */
+BELLESIP_EXPORT int belle_sip_transaction_state_is_transient(const belle_sip_transaction_state_t state);
+
+
+BELLESIP_EXPORT void *belle_sip_transaction_get_application_data(const belle_sip_transaction_t *t);
+BELLESIP_EXPORT void belle_sip_transaction_set_application_data(belle_sip_transaction_t *t, void *data);
+BELLESIP_EXPORT const char *belle_sip_transaction_get_branch_id(const belle_sip_transaction_t *t);
+BELLESIP_EXPORT belle_sip_transaction_state_t belle_sip_transaction_get_state(const belle_sip_transaction_t *t);
+BELLESIP_EXPORT const char *belle_sip_transaction_get_method(const belle_sip_transaction_t *t);
+BELLESIP_EXPORT void belle_sip_transaction_terminate(belle_sip_transaction_t *t);
+BELLESIP_EXPORT belle_sip_request_t *belle_sip_transaction_get_request(const belle_sip_transaction_t *t);
+BELLESIP_EXPORT belle_sip_response_t *belle_sip_transaction_get_response(const belle_sip_transaction_t *t);
+BELLESIP_EXPORT belle_sip_dialog_t*  belle_sip_transaction_get_dialog(const belle_sip_transaction_t *t);
+
+BELLESIP_EXPORT void belle_sip_server_transaction_send_response(belle_sip_server_transaction_t *t, belle_sip_response_t *resp);
+
+BELLESIP_EXPORT belle_sip_request_t * belle_sip_client_transaction_create_cancel(belle_sip_client_transaction_t *t);
+BELLESIP_EXPORT int belle_sip_client_transaction_send_request(belle_sip_client_transaction_t *t);
+/*
+ * Same as #belle_sip_client_transaction_send_request but with a predefined route.
+ * @param  t  belle_sip_client_transaction_t
+ * @param outbound_proxy uri use to directly send the request, useful for outbound proxy.
+ * */
+BELLESIP_EXPORT int belle_sip_client_transaction_send_request_to(belle_sip_client_transaction_t *t,belle_sip_uri_t* outbound_proxy);
+
+BELLESIP_EXPORT belle_sip_uri_t *belle_sip_client_transaction_get_route(belle_sip_client_transaction_t *t);
+
+/**
+ * Creates an a sip refresher for transaction like REGISTER/SUBSCRIBE or INVITE which could be refreshed.
+ * Transaction must in be in stated BELLE_SIP_TRANSACTION_COMPLETED. Refresher is created and started. A ref is taken on object transaction
+ * */
+BELLESIP_EXPORT belle_sip_refresher_t* belle_sip_client_transaction_create_refresher(belle_sip_client_transaction_t *t);
+/**
+ * Create an authenticated request based on an existing terminated transaction.
+ * <br>This function, update cseq, put route set and try to fill authorization headers. Initial request is not cloned.
+ * @param transaction . must be in state completed
+ * @param auth_infos  if auth infos cannot be added for an authenticate header,
+ * @param realm optional - If an outbound proxy realm is used, digestion authentication can be optimized.
+ * a newly allocated belle_sip_auth_info_t object is added to this list. These object contains useful information like realm and username. May be NULL
+ * */
+BELLESIP_EXPORT belle_sip_request_t* belle_sip_client_transaction_create_authenticated_request(belle_sip_client_transaction_t *t,belle_sip_list_t** auth_infos,const char* realm);
+
+/**
+ * For transactions over unreliable transports, stop retransmissions. This avoids for example to keep sending INVITE retransmissions of a call that has just been terminated, while
+ * keeping the transaction alive in order to eventually let a response being handled, so that the transaction can be cancelled properly.
+**/
+BELLESIP_EXPORT void belle_sip_client_transaction_stop_retransmissions(belle_sip_client_transaction_t *t);
+
+#define BELLE_SIP_TRANSACTION(t) BELLE_SIP_CAST(t,belle_sip_transaction_t)
+#define BELLE_SIP_SERVER_TRANSACTION(t) BELLE_SIP_CAST(t,belle_sip_server_transaction_t)
+#define BELLE_SIP_CLIENT_TRANSACTION(t) BELLE_SIP_CAST(t,belle_sip_client_transaction_t)
+
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/types.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/types.h"
new file mode 100755
index 0000000..f360238
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/types.h"
@@ -0,0 +1,197 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_TYPES_H
+#define BELLE_SIP_TYPES_H
+
+#include "belle-sip/defs.h"
+#include "belle-sip/object.h"
+#include "belle-sip/dict.h"
+
+#ifndef BELLESIP_DEPRECATED
+#if defined(_MSC_VER)
+	#define BELLESIP_DEPRECATED __declspec(deprecated)
+#else
+	#define BELLESIP_DEPRECATED __attribute__ ((deprecated))
+#endif
+#endif
+
+/**
+ * This enum declares all object types used in belle-sip (see belle_sip_object_t)
+**/
+BELLE_SIP_DECLARE_TYPES_BEGIN(belle_sip,1)
+	BELLE_SIP_TYPE_ID(belle_sip_stack_t),
+	BELLE_SIP_TYPE_ID(belle_sip_hop_t),
+	BELLE_SIP_TYPE_ID(belle_sip_object_pool_t),
+	BELLE_SIP_TYPE_ID(belle_sip_listening_point_t),
+	BELLE_SIP_TYPE_ID(belle_sip_datagram_listening_point_t),
+	BELLE_SIP_TYPE_ID(belle_sip_udp_listening_point_t),
+	BELLE_SIP_TYPE_ID(belle_sip_stream_listening_point_t),
+	BELLE_SIP_TYPE_ID(belle_sip_tls_listening_point_t),
+	BELLE_SIP_TYPE_ID(belle_sip_tunnel_listening_point_t),
+	BELLE_SIP_TYPE_ID(belle_sip_channel_t),
+	BELLE_SIP_TYPE_ID(belle_sip_udp_channel_t),
+	BELLE_SIP_TYPE_ID(belle_sip_stream_channel_t),
+	BELLE_SIP_TYPE_ID(belle_sip_tls_channel_t),
+	BELLE_SIP_TYPE_ID(belle_sip_tunnel_channel_t),
+	BELLE_SIP_TYPE_ID(belle_sip_provider_t),
+	BELLE_SIP_TYPE_ID(belle_sip_main_loop_t),
+	BELLE_SIP_TYPE_ID(belle_sip_source_t),
+	BELLE_SIP_TYPE_ID(belle_sip_mdns_source_t),
+	BELLE_SIP_TYPE_ID(belle_sip_resolver_context_t),
+	BELLE_SIP_TYPE_ID(belle_sip_transaction_t),
+	BELLE_SIP_TYPE_ID(belle_sip_server_transaction_t),
+	BELLE_SIP_TYPE_ID(belle_sip_client_transaction_t),
+	BELLE_SIP_TYPE_ID(belle_sip_ict_t),
+	BELLE_SIP_TYPE_ID(belle_sip_nict_t),
+	BELLE_SIP_TYPE_ID(belle_sip_ist_t),
+	BELLE_SIP_TYPE_ID(belle_sip_nist_t),
+	BELLE_SIP_TYPE_ID(belle_sip_dialog_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_address_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_contact_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_from_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_to_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_via_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_diversion_t),
+	BELLE_SIP_TYPE_ID(belle_sip_uri_t),
+	BELLE_SIP_TYPE_ID(belle_sip_message_t),
+	BELLE_SIP_TYPE_ID(belle_sip_request_t),
+	BELLE_SIP_TYPE_ID(belle_sip_response_t),
+	BELLE_SIP_TYPE_ID(belle_sip_object_t),
+	BELLE_SIP_TYPE_ID(belle_sip_parameters_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_call_id_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_cseq_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_content_type_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_route_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_record_route_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_user_agent_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_content_length_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_extension_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_authorization_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_proxy_authorization_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_www_authenticate_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_proxy_authenticate_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_max_forwards_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_expires_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_allow_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_attribute_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_bandwidth_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_connection_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_email_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_info_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_key_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_media_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_media_description_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_origin_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_phone_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_raw_attribute_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_repeate_time_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_rtcp_fb_attribute_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_rtcp_xr_attribute_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_session_description_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_session_name_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_time_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_time_description_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_uri_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_version_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_base_description_t),
+	BELLE_SIP_TYPE_ID(belle_sdp_mime_parameter_t),
+	BELLE_SIP_TYPE_ID(belle_sip_callbacks_t),
+	BELLE_SIP_TYPE_ID(belle_sip_refresher_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_subscription_state_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_service_route_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_refer_to_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_referred_by_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_replaces_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_date_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_p_preferred_identity_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_privacy_t),
+	BELLE_SIP_TYPE_ID(belle_sip_certificates_chain_t),
+	BELLE_SIP_TYPE_ID(belle_sip_signing_key_t),
+	BELLE_SIP_TYPE_ID(belle_sip_dns_srv_t),
+	BELLE_SIP_TYPE_ID(belle_sip_simple_resolver_context_t),
+	BELLE_SIP_TYPE_ID(belle_sip_combined_resolver_context_t),
+	BELLE_SIP_TYPE_ID(belle_sip_dict_t),
+	BELLE_SIP_TYPE_ID(belle_sip_dual_resolver_context_t),
+	BELLE_SIP_TYPE_ID(belle_http_provider_t),
+	BELLE_SIP_TYPE_ID(belle_http_request_t),
+	BELLE_SIP_TYPE_ID(belle_http_response_t),
+	BELLE_SIP_TYPE_ID(belle_http_channel_context_t),
+	BELLE_SIP_TYPE_ID(belle_generic_uri_t),
+	BELLE_SIP_TYPE_ID(belle_http_callbacks_t),
+	BELLE_SIP_TYPE_ID(belle_tls_crypto_config_t),
+	BELLE_SIP_TYPE_ID(belle_http_header_authorization_t),
+	BELLE_SIP_TYPE_ID(belle_sip_body_handler_t),
+	BELLE_SIP_TYPE_ID(belle_sip_memory_body_handler_t),
+	BELLE_SIP_TYPE_ID(belle_sip_user_body_handler_t),
+	BELLE_SIP_TYPE_ID(belle_sip_file_body_handler_t),
+	BELLE_SIP_TYPE_ID(belle_sip_multipart_body_handler_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_event_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_supported_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_require_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_content_disposition_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_accept_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_reason_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_authentication_info_t),
+	BELLE_SIP_TYPE_ID(belle_sip_mdns_register_t),
+	BELLE_SIP_TYPE_ID(belle_sip_resolver_results_t),
+	BELLE_SIP_TYPE_ID(belle_sip_cpp_object_t),
+	BELLE_SIP_TYPE_ID(belle_sip_header_retry_after_t)
+BELLE_SIP_DECLARE_TYPES_END
+
+
+enum belle_sip_interface_ids{
+	belle_sip_interface_id_first=1,
+	BELLE_SIP_INTERFACE_ID(belle_sip_channel_listener_t),
+	BELLE_SIP_INTERFACE_ID(belle_sip_listener_t),
+	BELLE_SIP_INTERFACE_ID(belle_http_request_listener_t)
+};
+
+/*these types are declared here because they are widely used in many headers included after*/
+
+typedef struct belle_sip_listening_point belle_sip_listening_point_t;
+typedef struct belle_sip_tls_listening_point belle_sip_tls_listening_point_t;
+typedef struct belle_sip_stack belle_sip_stack_t;
+typedef struct belle_sip_provider belle_sip_provider_t;
+typedef struct belle_http_provider belle_http_provider_t;
+typedef struct belle_sip_dialog belle_sip_dialog_t;
+typedef struct belle_sip_transaction belle_sip_transaction_t;
+typedef struct belle_sip_server_transaction belle_sip_server_transaction_t;
+typedef struct belle_sip_client_transaction belle_sip_client_transaction_t;
+typedef struct _belle_sip_message belle_sip_message_t;
+typedef struct _belle_sip_request belle_sip_request_t;
+typedef struct _belle_sip_response belle_sip_response_t;
+typedef struct belle_http_request belle_http_request_t;
+typedef struct belle_http_response belle_http_response_t;
+typedef struct belle_sip_hop belle_sip_hop_t;
+typedef struct _belle_generic_uri belle_generic_uri_t;
+typedef struct _belle_sip_uri belle_sip_uri_t;
+typedef struct _belle_sip_parameters belle_sip_parameters_t;
+typedef struct belle_sip_param_pair belle_sip_param_pair_t;
+typedef struct _belle_sip_header belle_sip_header_t;
+typedef struct belle_tls_crypto_config belle_tls_crypto_config_t;
+typedef struct belle_tls_crypto_config belle_tls_verify_policy_t; /* belle_tls_verify_policy_t is deprecated, just for backward compatibility */
+typedef struct belle_sip_body_handler belle_sip_body_handler_t;
+typedef struct belle_sip_memory_body_handler belle_sip_memory_body_handler_t;
+typedef struct belle_sip_user_body_handler belle_sip_user_body_handler_t;
+typedef struct belle_sip_file_body_handler belle_sip_file_body_handler_t;
+typedef struct belle_sip_multipart_body_handler belle_sip_multipart_body_handler_t;
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/utils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/utils.h"
new file mode 100755
index 0000000..6e6cf7f
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/utils.h"
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef BELLE_SIP_UTILS_H
+#define BELLE_SIP_UTILS_H
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include "belle-sip/defs.h"
+
+#include "bctoolbox/logging.h"
+#include "bctoolbox/vconnect.h"
+
+#define BELLE_SIP_LOG_DOMAIN "belle-sip"
+
+BELLE_SIP_BEGIN_DECLS
+
+#define belle_sip_malloc bctbx_malloc
+#define belle_sip_malloc0 bctbx_malloc0
+#define belle_sip_realloc bctbx_realloc
+#define belle_sip_free bctbx_free
+#define belle_sip_strdup bctbx_strdup
+
+BELLE_SIP_END_DECLS
+
+/***************/
+/* logging api */
+/***************/
+
+#define BELLE_SIP_LOG_FATAL BCTBX_LOG_FATAL
+#define	BELLE_SIP_LOG_ERROR BCTBX_LOG_ERROR
+#define	BELLE_SIP_LOG_WARNING BCTBX_LOG_WARNING
+#define	BELLE_SIP_LOG_MESSAGE BCTBX_LOG_MESSAGE
+#define	BELLE_SIP_LOG_DEBUG	BCTBX_LOG_DEBUG
+#define	BELLE_SIP_LOG_END BCTBX_LOG_END
+#define  belle_sip_log_level BctbxLogLevel
+
+#define belle_sip_log_function_t BctbxLogFunc
+
+
+typedef enum {
+	BELLE_SIP_NOT_IMPLEMENTED = -2,
+	BELLE_SIP_BUFFER_OVERFLOW = -1,
+	BELLE_SIP_OK = 0
+} belle_sip_error_code;
+
+
+#ifdef __GNUC__
+#define BELLE_SIP_CHECK_FORMAT_ARGS(m,n) __attribute__((format(printf,m,n)))
+#else
+#define BELLE_SIP_CHECK_FORMAT_ARGS(m,n)
+#endif
+
+BELLE_SIP_BEGIN_DECLS
+
+#define belle_sip_log_level_enabled(level) bctbx_log_level_enabled(BELLE_SIP_LOG_DOMAIN,level)
+
+#ifdef BELLE_SIP_DEBUG_MODE
+#define belle_sip_deb(...) bctbx_debug(...)
+#else
+
+#define belle_sip_debug(...)
+
+#endif
+
+#ifdef BELLE_SIP_NOMESSAGE_MODE
+
+#define belle_sip_log(...)
+#define belle_sip_message(...)
+#define belle_sip_warning(...)
+
+#else
+
+#define belle_sip_log bctbx_log
+#define belle_sip_message bctbx_message
+#define belle_sip_warning bctbx_warning
+#define belle_sip_error bctbx_error
+#define belle_sip_fatal bctbx_fatal
+#define belle_sip_logv bctbx_logv
+#endif
+
+
+BELLESIP_EXPORT void  belle_sip_set_log_handler(belle_sip_log_function_t func);
+
+
+#define belle_sip_strdup_printf bctbx_strdup_printf
+#define belle_sip_strcat_vprintf bctbx_strcat_vprintf
+#define belle_sip_strcat_printf bctbx_strcat_printf
+
+BELLESIP_EXPORT belle_sip_error_code BELLE_SIP_CHECK_FORMAT_ARGS(4,5) belle_sip_snprintf(char *buff, size_t buff_size, size_t *offset, const char *fmt, ...);
+BELLESIP_EXPORT belle_sip_error_code belle_sip_snprintf_valist(char *buff, size_t buff_size, size_t *offset, const char *fmt, va_list args);
+
+#define belle_sip_set_log_level(level) bctbx_set_log_level(BELLE_SIP_LOG_DOMAIN,level);
+
+BELLESIP_EXPORT char * belle_sip_random_token(char *ret, size_t size);
+
+BELLESIP_EXPORT unsigned char * belle_sip_random_bytes(unsigned char *ret, size_t size);
+
+BELLESIP_EXPORT uint32_t belle_sip_random(void);
+
+BELLESIP_EXPORT char * belle_sip_octets_to_text(const unsigned char *hash, size_t hash_len, char *ret, size_t size);
+
+BELLESIP_EXPORT char * belle_sip_create_tag(char *ret, size_t size);
+
+BELLESIP_EXPORT const char* belle_sip_version_to_string(void);
+
+/**
+ * Returns string without surrounding quotes if any, else just call belle_sip_strdup().
+**/
+BELLESIP_EXPORT char *belle_sip_unquote_strdup(const char *str);
+
+BELLESIP_EXPORT uint64_t belle_sip_time_ms(void);
+
+/** Connect API */
+BELLESIP_EXPORT void belle_sip_set_socket_api(bctbx_vsocket_api_t* my_api);
+
+#if defined(_WIN32)
+
+#include <winsock2.h>
+#include <ws2tcpip.h>
+
+typedef SOCKET belle_sip_socket_t;
+typedef HANDLE belle_sip_fd_t;
+#else
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+
+typedef int belle_sip_socket_t;
+typedef int belle_sip_fd_t;
+
+#endif
+
+
+typedef void (*belle_sip_background_task_end_callback_t)(void *);
+BELLESIP_EXPORT unsigned long belle_sip_begin_background_task(const char *name, belle_sip_background_task_end_callback_t cb, void *data);
+BELLESIP_EXPORT void belle_sip_end_background_task(unsigned long id);
+
+/**
+ * create a directory if it doesn't already exists
+ *
+ * @param[in]   path        The directory to be created
+ * @return 0 in case of succes, -1 otherwise, note it returns -1 if the directory already exists
+ */
+BELLESIP_EXPORT int belle_sip_mkdir(const char *path);
+
+BELLE_SIP_END_DECLS
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/wakelock.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/wakelock.h"
new file mode 100755
index 0000000..a05b0be
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Headers/wakelock.h"
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2012-2019 Belledonne Communications SARL.
+ *
+ * This file is part of belle-sip.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef WAKE_LOCK_H
+#define WAKE_LOCK_H
+
+#include <jni.h>
+#include "belle-sip/defs.h"
+
+BELLE_SIP_BEGIN_DECLS
+
+/**
+ * Initialize the Android wake lock system inside Belle-SIP.
+ * This function must be called only once when the program starts.
+ * @param env A JNI environment
+ * @parma pm An android.os.PowerManager java object.
+ */
+BELLESIP_EXPORT void belle_sip_wake_lock_init(JNIEnv *env, jobject pm);
+
+/**
+ * Uninit the the Android wake lock system. This function may be called
+ * while the program stopping.
+ * @param env A JNI environment.
+ */
+BELLESIP_EXPORT void belle_sip_wake_lock_uninit(JNIEnv *env);
+
+BELLE_SIP_END_DECLS
+
+#endif // WALE_LOCK_H
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Info.plist"
new file mode 100755
index 0000000..1907b28
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/belle-sip" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/belle-sip"
new file mode 100755
index 0000000..264cda2
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belle-sip.framework/belle-sip"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belr.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belr.framework/Info.plist"
new file mode 100755
index 0000000..5786722
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belr.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belr.framework/belr" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belr.framework/belr"
new file mode 100755
index 0000000..9a5382e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/belr.framework/belr"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Headers/lime.hpp" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Headers/lime.hpp"
new file mode 100755
index 0000000..53836cb
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Headers/lime.hpp"
@@ -0,0 +1,384 @@
+/*
+	lime.hpp
+	@author Johan Pascal
+	@copyright	Copyright (C) 2017  Belledonne Communications SARL
+
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 3 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef lime_hpp
+#define lime_hpp
+
+#include <memory> //smart ptrs
+#include <unordered_map>
+#include <vector>
+#include <functional>
+#include <string>
+#include <mutex>
+
+namespace lime {
+
+	/** Identifies the elliptic curve used in lime, the values assigned are used in localStorage and X3DH server
+	 * so do not modify it or we'll loose sync with existing DB and X3DH server
+	 */
+	enum class CurveId : uint8_t {
+		unset=0, /**< used as default to detected incorrect behavior */
+		c25519=1, /**< Curve 25519 */
+		c448=2 /**< Curve 448-goldilocks */
+	};
+
+	/** Manage the encryption policy : how is the user's plaintext encrypted */
+	enum class EncryptionPolicy {
+		DRMessage, /**< the plaintext input is encrypted inside the Double Ratchet message (each recipient get a different encryption): not optimal for messages with numerous recipient */
+		cipherMessage, /**< the plaintext input is encrypted with a random key and this random key is encrypted to each participant inside the Double Ratchet message(for a single recipient the overhead is 48 bytes) */
+		optimizeUploadSize, /**< optimize upload size: encrypt in DR message if plaintext is short enougth to beat the overhead introduced by cipher message scheme, otherwise use cipher message. Selection is made on upload size only. This is the default policy used */
+		optimizeGlobalBandwidth /**< optimize bandwith usage: encrypt in DR message if plaintext is short enougth to beat the overhead introduced by cipher message scheme, otherwise use cipher message. Selection is made on uploadand download (from server to recipients) sizes added. */
+	};
+
+	/**
+	 * A peer device status returned after encrypt, decrypt or when directly asking for the peer device status to spot new devices and give information on our trust on this device
+	 * The values explicitely mapped to specific integers(untrusted, trusted, unsafe) are stored in local storage as integer
+	 * Do not modify the mapping or we will loose backward compatibility with existing databases
+	 */
+	enum class PeerDeviceStatus : uint8_t {
+		untrusted=0, /**< we know this device but do not trust it, that information shall be displayed to the end user, a colour code shall be enough */
+		trusted=1, /**< this peer device already got its public identity key validated, that information shall be displayed to the end user too */
+		unsafe=2, /**< this status is a helper for the library user. It is used only by the peerDeviceStatus accessor functions */
+		fail, /**< when returned by decrypt : we could not decrypt the incoming message\n
+			when returned by encrypt in the peerStatus: we could not encrypt to this recipient(probably because it does not published keys on the X3DH server) */
+		unknown /**< when returned after encryption or decryption, means it is the first time we communicate with this device (and thus create a DR session with it)\n
+			   when returned by a get_peerDeviceStatus: this device is not in localStorage */
+	};
+
+	/** @brief The encrypt function input/output data structure
+	 *
+	 * give a recipient GRUU and get it back with the header which must be sent to recipient with the cipher text
+	 */
+	struct RecipientData {
+		const std::string deviceId; /**< input: recipient deviceId (shall be GRUU) */
+		lime::PeerDeviceStatus peerStatus; /**< input: if set to fail, this entry will be ignored by the encrypt function\n
+						output: after encrypt calls back, it will hold the status of this peer device:\n
+						     - unknown: first interaction with this device)
+						     - untrusted: device is kown but we never confirmed its identity public key
+						     - trusted: we already confirmed this device identity public key
+						     - fail: we could not encrypt for this device, probably because it never published its keys on the X3DH server */
+		std::vector<uint8_t> DRmessage; /**< output: after encrypt calls back, it will hold the Double Ratchet message targeted to the specified recipient. */
+		/**
+		 * recipient data are built giving a recipient id
+		 * @param[in] deviceId	the recipient device Id (its GRUU)
+		 */
+		RecipientData(const std::string &deviceId) : deviceId{deviceId}, peerStatus{lime::PeerDeviceStatus::unknown}, DRmessage{} {};
+	};
+
+	/** what a Lime callback could possibly say */
+	enum class CallbackReturn : uint8_t {
+		success, /**< operation completed successfully */
+		fail /**< operation failed, we shall have an explanation string too */
+	};
+	/** @brief Callback use to give a status on asynchronous operation
+	 *
+	 *	it returns a code and may return a string (could actually be empty) to detail what's happening
+	 *  	callback is used on every operation possibly involving a connection to X3DH server: create_user, delete_user, encrypt and update
+	 *  @param[in]	status	success or fail
+	 *  @param[in]	message	in case of failure, an explanation, it may be empty
+	 */
+	using limeCallback = std::function<void(const lime::CallbackReturn status, const std::string message)>;
+
+	/* X3DH server communication : these functions prototypes are used to post data and get response from/to the X3DH server */
+	/**
+	 * @brief Get the response from server. The external service providing secure communication to the X3DH server shall forward to lime library the server's response
+	 *
+	 * @param[in]	responseCode	Lime expects communication with server to be over HTTPS, this shall be the response code. Lime expects 200 for successfull response from server.
+	 * 				Any other response code is treated as an error and response ignored(but it is still usefull to forward it in order to perform internal cleaning)
+	 * @param[in]	responseBody	The actual response from X3DH server
+	 */
+	using limeX3DHServerResponseProcess = std::function<void(int responseCode, const std::vector<uint8_t> &responseBody)>;
+
+	/**
+	 * @brief Post a message to the X3DH server
+	 *
+	 * @param[in]	url			X3DH server's URL
+	 * @param[in]	from			User identification on X3DH server (which shall challenge for password digest, this is not however part of lime)
+	 * @param[in]	message			The message to post to the X3DH server
+	 * @param[in]	responseProcess		Function to be called with server's response
+	 */
+	using limeX3DHServerPostData = std::function<void(const std::string &url, const std::string &from, const std::vector<uint8_t> &message, const limeX3DHServerResponseProcess &reponseProcess)>;
+
+	/* Forward declare the class managing one lime user*/
+	class LimeGeneric;
+
+	/** @brief Manage several Lime objects(one is needed for each local user).
+	 *
+	 * 	LimeManager is mostly a cache of Lime users, any command get as first parameter the device Id (Lime manage devices only, the link user(sip:uri)<->device(GRUU) is provided by upper level)
+	 *	All interactions should take place through the LimeManager object, any endpoint shall have only one LimeManager object instanciated
+	 */
+
+	class LimeManager {
+		private :
+			std::unordered_map<std::string, std::shared_ptr<LimeGeneric>> m_users_cache; // cache of already opened Lime Session, identified by user Id (GRUU)
+			std::mutex m_users_mutex; // m_users_cache mutex
+			std::string m_db_access; // DB access information forwarded to SOCI to correctly access database
+			std::shared_ptr<std::recursive_mutex> m_db_mutex; // database access mutex
+			limeX3DHServerPostData m_X3DH_post_data; // send data to the X3DH key server
+			void load_user(std::shared_ptr<LimeGeneric> &user, const std::string &localDeviceId, const bool allStatus=false); // helper function, get from m_users_cache of local Storage the requested Lime object
+
+		public :
+
+			/**
+			 * @brief Create a user in local database and publish it on the given X3DH server
+			 *
+			 * 	The Lime user shall be created at the same time the account is created on the device, this function shall not be called again, attempt to re-create an already existing user will fail.
+			 * 	A user is identified by its deviceId (shall be the GRUU) and must at creation select a base Elliptic curve to use, this setting cannot be changed later
+			 * 	A user is published on an X3DH key server who must run using the same elliptic curve selected for this user (creation will fail otherwise), the server url cannot be changed later
+			 *
+			 * @param[in]	localDeviceId		Identify the local user account, it must be unique and is also be used as Id on the X3DH key server, it shall be the GRUU
+			 * @param[in]	x3dhServerUrl		The complete url(including port) of the X3DH key server. It must connect using HTTPS. Example: https://sip5.linphone.org:25519
+			 * @param[in]	curve			Choice of elliptic curve used as base for ECDH and EdDSA operation involved. Can be CurveId::c25519 or CurveId::c448.
+			 * @param[in]	OPkInitialBatchSize	Number of OPks in the first batch uploaded to X3DH server
+			 * @param[in]	callback		This operation contact the X3DH server and is thus asynchronous, when server responds,
+			 * 					this callback will be called giving the exit status and an error message in case of failure
+			 * @note
+			 * The OPkInitialBatchSize is optionnal, if not used, set to defaults defined in lime::settings
+			 * (not done with param default value as the lime::settings shall not be available in public include)
+			 */
+			void create_user(const std::string &localDeviceId, const std::string &x3dhServerUrl, const lime::CurveId curve, const uint16_t OPkInitialBatchSize, const limeCallback &callback);
+			/**
+			 * @overload void create_user(const std::string &localDeviceId, const std::string &x3dhServerUrl, const lime::CurveId curve, const limeCallback &callback)
+			 */
+			void create_user(const std::string &localDeviceId, const std::string &x3dhServerUrl, const lime::CurveId curve, const limeCallback &callback);
+
+			/**
+			 * @brief Delete a user from local database and from the X3DH server
+			 *
+			 * if specified localDeviceId is not found in local Storage, throw an exception
+			 *
+			 * @param[in]	localDeviceId	Identify the local user acount to use, it must be unique and is also be used as Id on the X3DH key server, it shall be the GRUU
+			 * @param[in]	callback	This operation contact the X3DH server and is thus asynchronous, when server responds,
+			 * 				this callback will be called giving the exit status and an error message in case of failure
+			 */
+			void delete_user(const std::string &localDeviceId, const limeCallback &callback);
+
+			/**
+			 * @brief Check if a user is present and active in local storage
+			 *
+			 * @param[in]	localDeviceId	used to identify which local account looking up, shall be the GRUU
+			 *
+			 * @return true if the user is active in the local storage, false otherwise
+			 */
+			bool is_user(const std::string &localDeviceId);
+
+			/**
+			 * @brief Encrypt a buffer (text or file) for a given list of recipient devices
+			 *
+			 * if specified localDeviceId is not found in local Storage, throw an exception
+			 *
+			 * 	Clarification on recipients:
+			 *
+			 * 	recipients information needed are a list of the device Id and one userId. The device Id shall be their GRUU while the userId is a sip:uri.
+			 *
+			 * 	recipient User Id is used to identify the actual intended recipient. Example: alice have two devices and is signed up on a conference having
+			 * 	bob and claire as other members. The recipientUserId will be the conference sip:uri and device list will include:
+			 * 		 - alice other device
+			 * 		 - bob devices
+			 * 		 - claire devices
+			 * 	If Alice write to Bob only, the recipientUserId will be bob sip:uri and recipient devices list :
+			 * 		 - alice other device
+			 * 		 - bob devices
+			 *
+			 * 	In all cases, the identified source of the message will be the localDeviceId
+			 *
+			 * 	If the X3DH server can't provide keys for a peer device, its status is set to fail and its DRmessage is empty. Other devices get their encrypted message
+			 * 	If no peer device could get encrypted for all of them are missing keys on the X3DH server, the callback will be called with fail exit status
+			 *
+			 * @note nearly all parameters are shared pointers as the process being asynchronous, the ownership will be taken internally exempting caller to manage the buffers.
+			 *
+			 * @param[in]		localDeviceId	used to identify which local acount to use and also as the identified source of the message, shall be the GRUU
+			 * @param[in]		recipientUserId	the Id of intended recipient, shall be a sip:uri of user or conference, is used as associated data to ensure no-one can mess with intended recipient
+			 * @param[in,out]	recipients	a list of RecipientData holding:
+			 * 					- the recipient device Id(GRUU)
+			 * 					- an empty buffer to store the DRmessage which must then be routed to that recipient
+			 * 					- the peer Status. If peerStatus is set to fail, this entry is ignored otherwise the peerStatus is set by the encrypt, see ::PeerDeviceStatus definition for details
+			 * @param[in]		plainMessage	a buffer holding the message to encrypt, can be text or data.
+			 * @param[out]		cipherMessage	points to the buffer to store the encrypted message which must be routed to all recipients(if one is produced, depends on encryption policy)
+			 * @param[in]		callback	Performing encryption may involve the X3DH server and is thus asynchronous, when the operation is completed,
+			 * 					this callback will be called giving the exit status and an error message in case of failure.
+			 * 					It is advised to capture a copy of cipherMessage and recipients shared_ptr in this callback so they can access
+			 * 					the output of encryption as it won't be part of the callback parameters.
+			 * @param[in]		encryptionPolicy	select how to manage the encryption: direct use of Double Ratchet message or encrypt in the cipher message and use the DR message to share the cipher message key
+			 * 						default is optimized upload size mode.
+			 */
+			void encrypt(const std::string &localDeviceId, std::shared_ptr<const std::string> recipientUserId, std::shared_ptr<std::vector<RecipientData>> recipients, std::shared_ptr<const std::vector<uint8_t>> plainMessage, std::shared_ptr<std::vector<uint8_t>> cipherMessage, const limeCallback &callback, lime::EncryptionPolicy encryptionPolicy=lime::EncryptionPolicy::optimizeUploadSize);
+
+			/**
+			 * @brief Decrypt the given message
+			 *
+			 * if specified localDeviceId is not found in local Storage, throw an exception
+			 *
+			 * @param[in]		localDeviceId	used to identify which local acount to use and also as the recipient device ID of the message, shall be the GRUU
+			 * @param[in]		recipientUserId	the Id of intended recipient, shall be a sip:uri of user or conference, is used as associated data to ensure no-one can mess with intended recipient
+			 * 					it is not necessarily the sip:uri base of the GRUU as this could be a message from alice first device intended to bob being decrypted on alice second device
+			 * @param[in]		senderDeviceId	Identify sender Device. This field shall be extracted from signaling data in transport protocol, is used to rebuild the authenticated data associated to the encrypted message
+			 * @param[in]		DRmessage	Double Ratchet message targeted to current device
+			 * @param[in]		cipherMessage	when present (depends on encryption policy) holds a common part of the encrypted message. Can be ignored or set to empty vector if not present in the incoming message.
+			 * @param[out]		plainMessage	the output buffer
+			 *
+			 * @return	fail if we cannot decrypt the message, unknown when it is the first message we ever receive from the sender device, untrusted for known but untrusted sender device, or trusted if it is
+			 */
+			lime::PeerDeviceStatus decrypt(const std::string &localDeviceId, const std::string &recipientUserId, const std::string &senderDeviceId, const std::vector<uint8_t> &DRmessage, const std::vector<uint8_t> &cipherMessage, std::vector<uint8_t> &plainMessage);
+			/**
+			 * @overload decrypt(const std::string &localDeviceId, const std::string &recipientUserId, const std::string &senderDeviceId, const std::vector<uint8_t> &DRmessage, std::vector<uint8_t> &plainMessage)
+			 * convenience form to be called when no cipher message is received
+			 */
+			lime::PeerDeviceStatus decrypt(const std::string &localDeviceId, const std::string &recipientUserId, const std::string &senderDeviceId, const std::vector<uint8_t> &DRmessage, std::vector<uint8_t> &plainMessage);
+
+			/**
+			 * @brief Update: shall be called once a day at least, performs checks, updates and cleaning operations
+			 *
+			 *  - check if we shall update a new SPk to X3DH server(SPk lifetime is set in settings)
+			 *  - check if we need to upload OPks to X3DH server
+			 *  - remove old SPks, clean double ratchet sessions (remove staled, clean their stored keys for skipped messages)
+			 *
+			 *  Is performed for all users founds in local storage
+			 *
+			 * @param[in]	callback		This operation may contact the X3DH server and is thus asynchronous, when server responds,
+			 * 					this callback will be called giving the exit status and an error message in case of failure.
+			 * @param[in]	OPkServerLowLimit	If server holds less OPk than this limit, generate and upload a batch of OPks
+			 * @param[in]	OPkBatchSize		Number of OPks in a batch uploaded to server
+			 *
+			 * @note
+			 * The last two parameters are optional, if not used, set to defaults defined in lime::settings
+			 * (not done with param default value as the lime::settings shall not be available in public include)
+			 */
+			void update(const limeCallback &callback, uint16_t OPkServerLowLimit, uint16_t OPkBatchSize);
+			/**
+			 * @overload void update(const limeCallback &callback)
+			 */
+			void update(const limeCallback &callback);
+
+			/**
+			 * @brief retrieve self Identity Key, an EdDSA formatted public key
+			 *
+			 * if specified localDeviceId is not found in local Storage, throw an exception
+			 *
+			 *
+			 * @param[in]	localDeviceId	used to identify which local account we're dealing with, shall be the GRUU
+			 * @param[out]	Ik		the EdDSA public identity key, formatted as in RFC8032
+			 */
+			void get_selfIdentityKey(const std::string &localDeviceId, std::vector<uint8_t> &Ik);
+
+			/**
+			 * @brief set the peer device status flag in local storage: unsafe, trusted or untrusted.
+			 *
+			 * @param[in]	peerDeviceId	The device Id of peer, shall be its GRUU
+			 * @param[in]	Ik		the EdDSA peer public identity key, formatted as in RFC8032
+			 * @param[in]	status		value of flag to set: accepted values are trusted, untrusted, unsafe
+			 *
+			 * throw an exception if given key doesn't match the one present in local storage
+			 * if the status flag value is unexpected (not one of trusted, untrusted, unsafe), ignore the call
+			 * if the status flag is unsafe or untrusted, ignore the value of Ik and call the version of this function without it
+			 *
+			 * if peer Device is not present in local storage and status is trusted or unsafe, it is added, if status is untrusted, it is just ignored
+			 *
+			 * General algorithm followed by the set_peerDeviceStatus functions
+			 * - Status is valid? (not one of trusted, untrusted, unsafe)? No: return
+			 * - status is trusted
+			 *       - We have Ik? -> No: return
+			 *       - Device is already in storage but Ik differs from the given one : exception
+			 *       - Insert/update in local storage
+			 * - status is untrusted
+			 *       - Ik is ignored
+			 *       - Device already in storage? No: return
+			 *       - Device already in storage but current status is unsafe? Yes: return
+			 *       - update in local storage
+			 * -status is unsafe
+			 *       - ignore Ik
+			 *       - insert/update the status. If inserted, insert an invalid Ik
+			 */
+			void set_peerDeviceStatus(const std::string &peerDeviceId, const std::vector<uint8_t> &Ik, lime::PeerDeviceStatus status);
+
+			/**
+			 * @brief set the peer device status flag in local storage: unsafe or untrusted.
+			 *
+			 * This variation allows to set a peer Device status to unsafe or untrusted only whithout providing its identity key Ik
+			 *
+			 * @param[in]	peerDeviceId	The device Id of peer, shall be its GRUU
+			 * @param[in]	status		value of flag to set: accepted values are untrusted or unsafe
+			 *
+			 * if the status flag value is unexpected (not one of untrusted, unsafe), ignore the call
+			 *
+			 * if peer Device is not present in local storage, it is inserted if status is unsafe and call is ignored if status is untrusted
+			 * if the status is untrusted but the current status in local storage is unsafe, ignore the call
+			 * Any call to the other form of the function with a status to unsafe or untrusted is rerouted to this function
+			 */
+			void set_peerDeviceStatus(const std::string &peerDeviceId, lime::PeerDeviceStatus status);
+
+			/**
+			 * @brief get the status of a peer device: unknown, untrusted, trusted, unsafe
+			 *
+			 * @param[in]	peerDeviceId	The device Id of peer, shall be its GRUU
+			 *
+			 * @return unknown if the device is not in localStorage, untrusted, trusted or unsafe according to the stored value of peer device status flag otherwise
+			 */
+			lime::PeerDeviceStatus get_peerDeviceStatus(const std::string &peerDeviceId);
+
+			/**
+			 * @brief delete a peerDevice from local storage
+			 *
+			 * @param[in]	peerDeviceId	The device Id to be removed from local storage, shall be its GRUU
+			 *
+			 * Call is silently ignored if the device is not found in local storage
+			 */
+			void delete_peerDevice(const std::string &peerDeviceId);
+
+			/**
+			 * @brief Set the X3DH key server URL for this identified user
+			 *
+			 * @param[in]	localDeviceId		Identify the local user account, it must be unique and is also be used as Id on the X3DH key server, it shall be the GRUU
+			 * @param[in]	x3dhServerUrl		The complete url(including port) of the X3DH key server. It must connect using HTTPS. Example: https://sip5.linphone.org:25519
+			 *
+			 * Throw an exception if the user is unknow or inactive
+			 */
+			void set_x3dhServerUrl(const std::string &localDeviceId, const std::string &x3dhServerUrl);
+
+			/**
+			 * @brief Get the X3DH key server URL for this identified user
+			 *
+			 * @param[in]	localDeviceId		Identify the local user account, it must be unique and is also be used as Id on the X3DH key server, it shall be the GRUU
+			 *
+			 * @return The complete url(including port) of the X3DH key server.
+			 *
+			 * Throw an exception if the user is unknow or inactive
+			 */
+			std::string get_x3dhServerUrl(const std::string &localDeviceId);
+
+			LimeManager() = delete; // no manager without Database and http provider
+			LimeManager(const LimeManager&) = delete; // no copy constructor
+			LimeManager operator=(const LimeManager &) = delete; // nor copy operator
+
+			/**
+			 * @brief Lime Manager constructor
+			 *
+			 * @param[in]	db_access	string used to access DB: can be filename for sqlite3 or access params for mysql, directly forwarded to SOCI session opening
+			 * @param[in]	X3DH_post_data	A function to send data to the X3DH server, parameters includes a callback to transfer back the server response
+			 * @param[in]	db_mutex	a mutex used to lock database access. Is optionnal: if not given, the manager will produce one internally
+			 */
+			LimeManager(const std::string &db_access, const limeX3DHServerPostData &X3DH_post_data, std::shared_ptr<std::recursive_mutex> db_mutex);
+			/**
+			 * @overload LimeManager(const std::string &db_access, const limeX3DHServerPostData &X3DH_post_data)
+			 */
+			LimeManager(const std::string &db_access, const limeX3DHServerPostData &X3DH_post_data);
+
+			~LimeManager() = default;
+	};
+} //namespace lime
+#endif /* lime_hpp */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Headers/lime_ffi.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Headers/lime_ffi.h"
new file mode 100755
index 0000000..4150aca
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Headers/lime_ffi.h"
@@ -0,0 +1,431 @@
+/**
+	@file lime_ffi.h
+
+	@brief This header exports lime's functionality via a C89 interface.
+
+	General rules of this API to make life easier to anyone trying to use it
+	from another langage:
+	- all interaction are done via pointer to opaque structure
+	- use only simple types:
+		- size_t for all buffer or array size
+		- const char * NULL terminated strings
+		- uint8_t * for binary buffers
+	- no ownership of memory transfers across the API boundary.\n
+	The API read data from const pointers and write output to buffers allocated by the caller.
+	- when exporting a binary blob, the function takes a pointer to the output buffer and a read/write pointer to the length.\n
+	If the size of the provided buffer is insufficient, an error is returned.
+
+	@warning Check carefully the lime_ffi_decrypt function's documentation as an output buffer too small on this one mean you would loose your decrypted message forever.
+
+	@author Johan Pascal
+
+	@copyright	Copyright (C) 2018  Belledonne Communications SARL
+
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 3 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+#ifndef lime_ffi_hpp
+#define lime_ffi_hpp
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+
+typedef struct lime_manager_struct* lime_manager_t;
+
+typedef struct lime_ffi_data_struct* lime_ffi_data_t;
+
+enum LIME_FFI_ERROR {
+	LIME_FFI_SUCCESS = 0,
+	LIME_FFI_INVALID_CURVE_ARGUMENT = -1,
+	LIME_FFI_INTERNAL_ERROR = -2,
+	LIME_FFI_OUTPUT_BUFFER_TOO_SMALL = -3,
+	LIME_FFI_USER_NOT_FOUND = -4
+};
+
+/** Identifies the elliptic curve used in lime, the values assigned are used in localStorage and X3DH server
+ * so do not modify it or we'll loose sync with existing DB and X3DH server
+ */
+enum lime_ffi_CurveId {
+	lime_ffi_CurveId_unset = 0, /**< used as default to detected incorrect behavior */
+	lime_ffi_CurveId_c25519 = 1, /**< Curve 25519 */
+	lime_ffi_CurveId_c448 = 2 /**< Curve 448-goldilocks */
+};
+
+/** Manage the encryption policy : how is the user's plaintext encrypted */
+enum lime_ffi_EncryptionPolicy {
+	lime_ffi_EncryptionPolicy_DRMessage, /**< the plaintext input is encrypted inside the Double Ratchet message (each recipient get a different encryption): not optimal for messages with numerous recipient */
+	lime_ffi_EncryptionPolicy_cipherMessage, /**< the plaintext input is encrypted with a random key and this random key is encrypted to each participant inside the Double Ratchet message(for a single recipient the overhead is 48 bytes) */
+	lime_ffi_EncryptionPolicy_optimizeUploadSize, /**< optimize upload size: encrypt in DR message if plaintext is short enougth to beat the overhead introduced by cipher message scheme, otherwise use cipher message. Selection is made on upload size only. This is the default policy used */
+	lime_ffi_EncryptionPolicy_optimizeGlobalBandwidth /**< optimize bandwith usage: encrypt in DR message if plaintext is short enougth to beat the overhead introduced by cipher message scheme, otherwise use cipher message. Selection is made on uploadand download (from server to recipients) sizes added. */
+};
+
+/**
+ * A peer device status returned after encrypt, decrypt or when directly asking for the peer device status to spot new devices and give information on our trust on this device
+ * The values explicitely mapped to specific integers(untrusted, trusted, unsafe) are stored in local storage as integer
+ * Do not modify the mapping or we will loose backward compatibility with existing databases
+ */
+enum lime_ffi_PeerDeviceStatus {
+	lime_ffi_PeerDeviceStatus_untrusted=0, /**< we know this device but do not trust it, that information shall be displayed to the end user, a colour code shall be enough */
+	lime_ffi_PeerDeviceStatus_trusted=1, /**< this peer device already got its public identity key validated, that information shall be displayed to the end user too */
+	lime_ffi_PeerDeviceStatus_unsafe=2, /**< this status is a helper for the library user. It is used only by the peerDeviceStatus accessor functions */
+	lime_ffi_PeerDeviceStatus_fail, /**< when returned by decrypt : we could not decrypt the incoming message\n
+			when returned by encrypt in the peerStatus: we could not encrypt to this recipient(probably because it does not published keys on the X3DH server) */
+	lime_ffi_PeerDeviceStatus_unknown /**< when returned after encryption or decryption, means it is the first time we communicate with this device (and thus create a DR session with it)\n
+			   when returned by a get_peerDeviceStatus: this device is not in localStorage */
+};
+
+/** what a Lime callback could possibly say */
+enum lime_ffi_CallbackReturn {
+	lime_ffi_CallbackReturn_success, /**< operation completed successfully */
+	lime_ffi_CallbackReturn_fail /**< operation failed, we shall have an explanation string too */
+};
+
+/** @brief The encrypt function input/output data structure
+ *
+ * give a recipient GRUU and get it back with the header which must be sent to recipient with the cipher text
+ */
+typedef struct {
+	char *deviceId; /**< input: recipient deviceId (shall be GRUU) */
+	enum lime_ffi_PeerDeviceStatus peerStatus; /**< output: after encrypt calls back, it will hold the status of this peer device:\n
+						     - lime_ffi_PeerDeviceStatus_unknown: first interaction with this device)
+						     - lime_ffi_PeerDeviceStatus_untrusted: device is kown but we never confirmed its identity public key
+						     - lime_ffi_PeerDeviceStatus_trusted: we already confirmed this device identity public key
+						     - lime_ffi_PeerDeviceStatus_fail: we could not encrypt for this device, probably because it never published its keys on the X3DH server */
+	uint8_t *DRmessage; /**< output: after encrypt calls back, it will hold the Double Ratchet message targeted to the specified recipient. */
+	size_t DRmessageSize; /**< input/output: size off the DRmessage buffer at input, size of written data as output */
+} lime_ffi_RecipientData_t;
+
+/** @brief Callback use to give a status on asynchronous operation
+ *
+ *	it returns a code and may return a string (could actually be empty) to detail what's happening
+ *  	callback is used on every operation possibly involving a connection to X3DH server: create_user, delete_user, encrypt and update
+ *
+ *  @param[in]	userData	pointer to user defined data structure passed back to him
+ *  @param[in]	status		success or fail
+ *  @param[in]	message		in case of failure, an explanation, it may be empty
+ */
+typedef void (*lime_ffi_Callback)(void *userData, const enum lime_ffi_CallbackReturn status, const char *message);
+
+/**
+ * @brief Post a message to the X3DH server
+ *
+ * this function prototype is used to post data to the X3DH server
+ * The response must be sent back to the lime engine using the lime_ffi_processX3DHServerResponse function
+ *
+ * @param[in]	userData	pointer given when registering the callback
+ * @param[in]	limeData	pointer to an opaque lime internal structure that must then be forwarded with the server response
+ * @param[in]	url		X3DH server's URL
+ * @param[in]	from		User identification on X3DH server (which shall challenge for password digest, this is not however part of lime)
+ * @param[in]	message		The message to post to the X3DH server
+ */
+typedef void (*lime_ffi_X3DHServerPostData)(void *userData, lime_ffi_data_t limeData, const char *url, const char *from,
+					const uint8_t *message, const size_t message_size);
+
+
+
+/**
+ * @brief Forward X3DH server response to the lime engine
+ *
+ * @param[in]	limeData	A pointer to an opaque structure used internally (provided by the X3DHServerPostData function)
+ * @param[in]	code		The response code given by X3DH server, connection is made through https, so we expect 200 for Ok
+ * @param[in]	response	binary buffered server response
+ * @param[in]	response_size	size of previous buffer
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_processX3DHServerResponse(lime_ffi_data_t limeData, const int code, const uint8_t *response, const size_t response_size);
+
+/**
+ * @brief Initialise a Lime Manager, only one per end-point is required.
+ *
+ * @param[out]	manager		pointer to the opaque structure used to interact with lime
+ * @param[in]	db		string used to access DB (shall be filename for sqlite3), directly forwarded to SOCI session opening
+ * @param[in]	X3DH_post_data	A function to send data to the X3DH server. The server response must be forwarded to lime using the lime_ffi_processX3DHServerResponse function
+ * @param[in]	userData	pointer passed back to the X3DH_post_data callback
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_manager_init(lime_manager_t * const manager, const char *db, const lime_ffi_X3DHServerPostData X3DH_post_data, void *userData);
+
+/**
+ * @brief Destroy the internal structure used to interact with lime
+ *
+ * @param[in,out]	manager		pointer to the opaque structure used to interact with lime
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_manager_destroy(lime_manager_t manager);
+
+
+/**
+ * @brief Insert a lime user in local base and publish him on the X3DH server
+ *
+ * @param[in]	manager			pointer to the opaque structure used to interact with lime
+ * @param[in]	localDeviceId		Identify the local user acount to use, it must be unique and is also be used as Id on the X3DH key server, it shall be the GRUU
+ * @param[in]	x3dhServerUrl		The complete url(including port) of the X3DH key server. It must connect using HTTPS. Example: https://sip5.linphone.org:25519
+ * @param[in]	curve			Choice of elliptic curve to use as base for ECDH and EdDSA operation involved. Can be lime_ffi_CurveId_c25519 or lime_ffi_CurveId_c448.
+ * @param[in]	OPkInitialBatchSize	Number of OPks in the first batch uploaded to X3DH server
+ * @param[in]	callback		This operation contact the X3DH server and is thus asynchronous, when server responds,\n
+ * 					this callback will be called giving the exit status and an error message in case of failure
+ * @param[in]	callbackUserData	this pointer will be forwarded to the callback as first parameter
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_create_user(lime_manager_t manager, const char *localDeviceId,
+		const char *x3dhServerUrl, const enum lime_ffi_CurveId curve, const uint16_t OPkInitialBatchSize,
+		const lime_ffi_Callback callback, void *callbackUserData);
+
+/**
+ * @brief Delete a user from local database and from the X3DH server
+ *
+ * if specified localDeviceId is not found in local Storage, return an error
+ *
+ * @param[in]	manager		pointer to the opaque structure used to interact with lime
+ * @param[in]	localDeviceId	Identify the local user acount to use, it must be unique and is also be used as Id on the X3DH key server, it shall be the GRUU
+ * @param[in]	callback	This operation contact the X3DH server and is thus asynchronous, when server responds,
+ * 				this callback will be called giving the exit status and an error message in case of failure
+ * @param[in]	callbackUserData	this pointer will be forwarded to the callback as first parameter
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_delete_user(lime_manager_t manager, const char *localDeviceId, const lime_ffi_Callback callback, void *callbackUserData);
+
+/**
+ * @brief Check if a user is present and active in local storage
+ *
+ * @param[in]	manager		pointer to the opaque structure used to interact with lime
+ * @param[in]	localDeviceId	used to identify which local account looking up, shall be the GRUU (Null terminated string)
+ *
+ * @return LIME_FFI_SUCCESS if the user is active in the local storage, LIME_FFI_USER_NOT_FOUND otherwise
+ */
+int lime_ffi_is_user(lime_manager_t manager, const char *localDeviceId);
+
+/**
+ * @brief Compute the maximum buffer sizes for the encryption outputs: DRmessage and cipherMessage
+ *
+ * @param[in]	plainMessageSize	size of the plain message to be encrypted
+ * @param[in]	curve			Choice of elliptic curve to use as base for ECDH and EdDSA operation involved. Can be lime_ffi_CurveId_c25519 or lime_ffi_CurveId_c448.
+ * @param[out]	DRmessageSize		maximum size of the DRmessage produced by the encrypt function
+ * @param[out]	cipherMessageSize	maximum size of the cipherMessage produced by the encrypt function
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_encryptOutBuffersMaximumSize(const size_t plainMessageSize,  const enum lime_ffi_CurveId curve, size_t *DRmessageSize, size_t *cipherMessageSize);
+
+/**
+ * @brief Encrypt a buffer (text or file) for a given list of recipient devices
+ *
+ * if specified localDeviceId is not found in local Storage, return an error
+ *
+ * 	Clarification on recipients:
+ *
+ * 	recipients information needed are a list of the device Id and one userId. The device Id shall be their GRUU while the userId is a sip:uri.
+ *
+ * 	recipient User Id is used to identify the actual intended recipient. Example: alice have two devices and is signed up on a conference having
+ * 	bob and claire as other members. The recipientUserId will be the conference sip:uri and device list will include:
+ * 		 - alice other device
+ * 		 - bob devices
+ * 		 - claire devices
+ * 	If Alice write to Bob only, the recipientUserId will be bob sip:uri and recipient devices list :
+ * 		 - alice other device
+ * 		 - bob devices
+ *
+ * 	In all cases, the identified source of the message will be the localDeviceId
+ *
+ * 	If the X3DH server can't provide keys for a peer device, its status is set to fail and its DRmessageSize is 0. Other devices get their encrypted message
+ * 	If no peer device could get encrypted for all of them are missing keys on the X3DH server, the callback will be called with fail exit status
+ *
+ * @note all buffers are allocated by caller. If a buffer is too small to get the data, the function will return an error.
+ *
+ * @param[in]		manager			pointer to the opaque structure used to interact with lime
+ * @param[in]		localDeviceId		used to identify which local acount to use and also as the identified source of the message, shall be the GRUU
+ * @param[in]		recipientUserId		the Id of intended recipient, shall be a sip:uri of user or conference, is used as associated data to ensure no-one can mess with intended recipient
+ * @param[in,out]	recipients		a list of RecipientData holding:
+ *	 					- the recipient device Id(GRUU)
+ * 						- an allocated buffer large enough to store the DRmessage which must then be routed to that recipient
+ * 						- the size of this buffer, updated with the actual size written in it when the operation is completed(after callbackStatus is executed)
+ * 						- the peer Status. If peerStatus is set to fail, this entry is ignored otherwise the peerStatus is set by the encrypt, see lime_ffi_PeerDeviceStatus definition for details
+ * @param[in]		recipientsSize		how many recipients are in the recipients array
+ * @param[in]		plainMessage		a buffer holding the message to encrypt, can be text or data.
+ * @param[in]		plainMessageSize	size of the plainMessage buffer
+ * @param[out]		cipherMessage		points to the buffer to store the encrypted message which must be routed to all recipients(if one is produced, depends on encryption policy)
+ * @param[in,out]	cipherMessageSize	size of the cipherMessage buffer, is updated with the size of the actual data written in it
+ * @param[in]		callback		Performing encryption may involve the X3DH server and is thus asynchronous, when the operation is completed,
+ * 						this callback will be called giving the exit status and an error message in case of failure.
+ * @param[in]		callbackUserData	this pointer will be forwarded to the callback as first parameter
+ * @param[in]		encryptionPolicy	select how to manage the encryption: direct use of Double Ratchet message or encrypt in the cipher message and use the DR message to share the cipher message key
+ * 						default is optimized output size mode.
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_encrypt(lime_manager_t manager, const char *localDeviceId,
+		const char *recipientUserId, lime_ffi_RecipientData_t *const recipients, const size_t recipientsSize,
+		const uint8_t *const plainMessage, const size_t plainMessageSize,
+		uint8_t *const cipherMessage, size_t *cipherMessageSize,
+		const lime_ffi_Callback callback, void *callbackUserData,
+		enum lime_ffi_EncryptionPolicy encryptionPolicy);
+
+
+/**
+ * @brief Decrypt the given message
+ *
+ * if specified localDeviceId is not found in local Storage, return an error
+ *
+ * @param[in]		manager			pointer to the opaque structure used to interact with lime
+ * @param[in]		localDeviceId		used to identify which local acount to use and also as the recipient device ID of the message, shall be the GRUU
+ * @param[in]		recipientUserId		the Id of intended recipient, shall be a sip:uri of user or conference, is used as associated data to ensure no-one can mess with intended recipient
+ * 						it is not necessarily the sip:uri base of the GRUU as this could be a message from alice first device intended to bob being decrypted on alice second device
+ * @param[in]		senderDeviceId		Identify sender Device. This field shall be extracted from signaling data in transport protocol, is used to rebuild the authenticated data associated to the encrypted message
+ * @param[in]		DRmessage		Double Ratchet message targeted to current device
+ * @param[in]		DRmessageSize		DRmessage buffer size
+ * @param[in]		cipherMessage		when present (depends on encryption policy) holds a common part of the encrypted message. Set to NULL if not present in the incoming message.
+ * @param[in]		cipherMessageSize	cipherMessage buffer size(set to 0 if no cipherMessage is present in the incoming message)
+ * @param[out]		plainMessage		the output buffer: its size shall be MAX(cipherMessageSize, DRmessageSize)
+ * @param[in,out]	plainMessageSize	plainMessage buffer size, updated with the actual size of the data written
+ *
+ * @warning The plainMessage buffer must be large enough to store the decrypted message or we face the possibility to not ever be able to decrypt the message.(internal successful decryption will remove the ability to decrypt the same message again). To avoid problem the size of the plain message shall be  MAX(cipherMessageSize, DRmessageSize) as:
+ * - The decrypted message is the same size of the encrypted one.
+ * - The encrypted message(not alone but we can afford the temporary usage of few dozens bytes) is stored either in cipherMessage or DRmessage depends on encrypter's choice
+ * - By allocating MAX(cipherMessageSize, DRmessageSize) bytes to the plainMessage buffer we ensure it can hold the decrypted message
+ *
+ * @return	fail if we cannot decrypt the message, unknown when it is the first message we ever receive from the sender device, untrusted for known but untrusted sender device, or trusted if it is
+ */
+enum lime_ffi_PeerDeviceStatus lime_ffi_decrypt(lime_manager_t manager, const char *localDeviceId,
+		const char *recipientUserId, const char *senderDeviceId,
+		const uint8_t *const DRmessage, const size_t DRmessageSize,
+		const uint8_t *const cipherMessage, const size_t cipherMessageSize,
+		uint8_t *const plainMessage, size_t *plainMessageSize);
+
+/**
+ * @brief retrieve self Identity Key, an EdDSA formatted public key
+ *
+ * if specified localDeviceId is not found in local Storage, return an error
+ *
+ * @param[in]		manager		pointer to the opaque structure used to interact with lime
+ * @param[in]		localDeviceId	used to identify which local account we're dealing with, shall be the GRUU
+ * @param[out]		Ik		the EdDSA public identity key, formatted as in RFC8032
+ * @param[in,out]	IkSize		size of the previous buffer, updated with the size of data actually written
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_get_selfIdentityKey(lime_manager_t manager, const char *localDeviceId, uint8_t *const Ik, size_t *IkSize);
+
+/**
+ * @brief set the peer device status flag in local storage: unsafe, trusted or untrusted.
+ *
+ * @param[in]	manager		pointer to the opaque structure used to interact with lime
+ * @param[in]	peerDeviceId	The device Id of peer, shall be its GRUU
+ * @param[in]	Ik		the EdDSA peer public identity key, formatted as in RFC8032 (optionnal, needed only if status is trusted)
+ * @param[in]	IkSize		size of the previous buffer
+ * @param[in]	status		value of flag to set: accepted values are trusted, untrusted, unsafe
+ *
+ * return an error if given key doesn't match the one present in local storage(if we have a key)
+ * if the status flag value is unexpected (not one of trusted, untrusted, unsafe), ignore the call
+ * if the status flag is unsafe or untrusted, ignore the value of Ik and call the version of this function without it
+ *
+ * if peer Device is not present in local storage and status is trusted or unsafe, it is added, if status is untrusted, it is just ignored
+ *
+ * General algorithm followed by the set_peerDeviceStatus functions
+ * - Status is valid? (not one of trusted, untrusted, unsafe)? No: return
+ * - status is trusted
+ *       - We have Ik? -> No: return
+ *       - Device is already in storage but Ik differs from the given one : exception
+ *       - Insert/update in local storage
+ * - status is untrusted
+ *       - Ik is ignored
+ *       - Device already in storage? No: return
+ *       - Device already in storage but current status is unsafe? Yes: return
+ *       - update in local storage
+ * -status is unsafe
+ *       - ignore Ik
+ *       - insert/update the status. If inserted, insert an invalid Ik
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_set_peerDeviceStatus(lime_manager_t manager, const char *peerDeviceId, const uint8_t *const Ik, const size_t IkSize, enum lime_ffi_PeerDeviceStatus status);
+
+/**
+ * @brief get the status of a peer device: unknown, untrusted, trusted, unsafe
+ *
+ * @param[in]	manager		pointer to the opaque structure used to interact with lime
+ * @param[in]	peerDeviceId	The device Id of peer, shall be its GRUU
+ *
+ * @return unknown if the device is not in localStorage, untrusted, trusted or unsafe according to the stored value of peer device status flag otherwise
+ */
+enum lime_ffi_PeerDeviceStatus lime_ffi_get_peerDeviceStatus(lime_manager_t manager, const char *peerDeviceId);
+
+
+/**
+ * @brief delete a peerDevice from local storage
+ *
+ * @param[in]	manager		pointer to the opaque structure used to interact with lime
+ * @param[in]	peerDeviceId	The device Id to be removed from local storage, shall be its GRUU
+ *
+ * Call is silently ignored if the device is not found in local storage
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_delete_peerDevice(lime_manager_t manager, const char *peerDeviceId);
+
+/**
+ * @brief Update: shall be called once a day at least, performs checks, updates and cleaning operations
+ *
+ *  - check if we shall update a new SPk to X3DH server(SPk lifetime is set in settings)
+ *  - check if we need to upload OPks to X3DH server
+ *  - remove old SPks, clean double ratchet sessions (remove staled, clean their stored keys for skipped messages)
+ *
+ *  Is performed for all users founds in local storage
+ *
+ * @param[in]	manager		pointer to the opaque structure used to interact with lime
+ * @param[in]	callback		Performing encryption may involve the X3DH server and is thus asynchronous, when the operation is completed,
+ * 					this callback will be called giving the exit status and an error message in case of failure.
+ * @param[in]	callbackUserData	this pointer will be forwarded to the callback as first parameter
+ * @param[in]	OPkServerLowLimit	If server holds less OPk than this limit, generate and upload a batch of OPks
+ * @param[in]	OPkBatchSize		Number of OPks in a batch uploaded to server
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_update(lime_manager_t manager, const lime_ffi_Callback callback, void *callbackUserData, uint16_t OPkServerLowLimit, uint16_t OPkBatchSize);
+
+/**
+ * @brief Set the X3DH key server URL for this identified user
+ *
+ * @param[in]	manager			pointer to the opaque structure used to interact with lime
+ * @param[in]	localDeviceId		Identify the local user account, it must be unique and is also be used as Id on the X3DH key server, it shall be the GRUU
+ * @param[in]	x3dhServerUrl		The complete url(including port) of the X3DH key server. It must connect using HTTPS. Example: https://sip5.linphone.org:25519
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_set_x3dhServerUrl(lime_manager_t manager, const char *localDeviceId, const char *x3dhServerUrl);
+
+/**
+ * @brief Get the X3DH key server URL for this identified user
+ *
+ * @param[in]		manager			pointer to the opaque structure used to interact with lime
+ * @param[in]		localDeviceId		Identify the local user account, it must be unique and is also be used as Id on the X3DH key server, it shall be the GRUU, in a NULL terminated string
+ * @param[in]		x3dhServerUrl		The complete url(including port) of the X3DH key server in a NULL terminated string
+ * @param[in,out]	x3dhServerUrlSize	Size of the previous buffer, is updated with actual size of data written(without the '\0', would give the same result as strlen.)
+ *
+ * @return LIME_FFI_SUCCESS or a negative error code
+ */
+int lime_ffi_get_x3dhServerUrl(lime_manager_t manager, const char *localDeviceId, char *x3dhServerUrl, size_t *x3dhServerUrlSize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* lime__ffi_hpp */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Info.plist"
new file mode 100755
index 0000000..9927a62
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/lime" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/lime"
new file mode 100755
index 0000000..5d4ca3e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/lime.framework/lime"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/account_creator.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/account_creator.h"
new file mode 100644
index 0000000..4e092ff
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/account_creator.h"
@@ -0,0 +1,585 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_ACCOUNT_CREATOR_H_
+#define LINPHONE_ACCOUNT_CREATOR_H_
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup account_creator
+ * @{
+ */
+
+/**
+ * Callback to notify a response of server.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] status The status of the #LinphoneAccountCreator test existence operation that has just finished
+**/
+typedef void (*LinphoneAccountCreatorCbsStatusCb)(LinphoneAccountCreator *creator, LinphoneAccountCreatorStatus status, const char* resp);
+
+/************************** Start Account Creator data **************************/
+
+/**
+ * Create a #LinphoneAccountCreator and set Linphone Request callbacks.
+ * @param[in] core The #LinphoneCore used for the XML-RPC communication
+ * @param[in] xmlrpc_url The URL to the XML-RPC server. Must be NON NULL.
+ * @return The new #LinphoneAccountCreator object.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreator * linphone_account_creator_new(LinphoneCore *core, const char *xmlrpc_url);
+
+
+/**
+ * Reset the account creator entries like username, password, phone number...
+ * @param[in] creator #LinphoneAccountCreator object
+**/
+LINPHONE_PUBLIC void linphone_account_creator_reset(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to know the existence of account on server.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_is_account_exist(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to create an account on server.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_create_account(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to know if an account is activated on server.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_is_account_activated(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to activate an account on server.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_activate_account(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to link an account to an alias.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_link_account(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to activate an alias.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_activate_alias(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to know if an alias is used.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_is_alias_used(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to know if an account is linked.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_is_account_linked(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to recover an account.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_recover_account(LinphoneAccountCreator *creator);
+
+/**
+ * Send a request to update an account.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return #LinphoneAccountCreatorStatusRequestOk if the request has been sent, #LinphoneAccountCreatorStatusRequestFailed otherwise
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_update_account(LinphoneAccountCreator *creator);
+
+/**
+ * Acquire a reference to the LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object.
+ * @return The same #LinphoneAccountCreator object.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreator * linphone_account_creator_ref(LinphoneAccountCreator *creator);
+
+/**
+ * Release reference to the LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_unref(LinphoneAccountCreator *creator);
+
+/**
+ * Retrieve the user pointer associated with the LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object.
+ * @return The user pointer associated with the LinphoneAccountCreator.
+**/
+LINPHONE_PUBLIC void *linphone_account_creator_get_user_data(const LinphoneAccountCreator *creator);
+
+/**
+ * Assign a user pointer to the LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object.
+ * @param[in] ud The user pointer to associate with the LinphoneAccountCreator.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_set_user_data(LinphoneAccountCreator *creator, void *ud);
+
+/**
+ * Assign a proxy config pointer to the LinphoneAccountCreator.
+ * @param[in] creator LinphoneAccountCreator object.
+ * @param[in] cfg The LinphoneProxyConfig to associate with the LinphoneAccountCreator.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_set_proxy_config(LinphoneAccountCreator *creator, LinphoneProxyConfig *cfg);
+
+/**
+ * Set the username.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] username The username to set
+ * @return #LinphoneAccountCreatorUsernameStatusOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorUsernameStatus linphone_account_creator_set_username(LinphoneAccountCreator *creator, const char *username);
+
+/**
+ * Get the username.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The username of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_username(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the phone number normalized.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] phone_number The phone number to set
+ * @param[in] country_code Country code to associate phone number with
+ * @return #LinphoneAccountCreatorPhoneNumberStatusOk if everything is OK, or specific(s) error(s) otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorPhoneNumberStatusMask linphone_account_creator_set_phone_number(LinphoneAccountCreator *creator, const char *phone_number, const char *country_code);
+
+/**
+ * Get the RFC 3966 normalized phone number.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The phone number of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_phone_number(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the password.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] password The password to set
+ * @return #LinphoneAccountCreatorPasswordStatusOk if everything is OK, or specific(s) error(s) otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorPasswordStatus linphone_account_creator_set_password(LinphoneAccountCreator *creator, const char *password);
+
+/**
+ * Get the password.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The password of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_password(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the ha1.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] ha1 The ha1 to set
+ * @return #LinphoneAccountCreatorPasswordStatusOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorPasswordStatus linphone_account_creator_set_ha1(LinphoneAccountCreator *creator, const char *ha1);
+
+/**
+ * Get the ha1.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The ha1 of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_ha1(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the activation code.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] activation_code The activation code to set
+ * @return #LinphoneAccountCreatorActivationCodeStatusOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorActivationCodeStatus linphone_account_creator_set_activation_code(LinphoneAccountCreator *creator, const char *activation_code);
+
+/**
+ * Get the activation code.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The activation code of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_activation_code(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the language to use in email or SMS if supported.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] lang The language to use
+ * @return #LinphoneAccountCreatorLanguageStatusOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorLanguageStatus linphone_account_creator_set_language(LinphoneAccountCreator *creator, const char *lang);
+
+/**
+* Set the supported algorithm.
+* @param[in] creator LinphoneAccountCreator object
+* @param[in] algorithm The algorithm to use
+* @return LinphoneAccountCreatorAlgoStatusOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorAlgoStatus linphone_account_creator_set_algorithm(LinphoneAccountCreator *creator, const char *algorithm);
+
+/**
+ * Get the language use in email of SMS.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The language of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_language(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the display name.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] display_name The display name to set
+ * @return #LinphoneAccountCreatorUsernameStatusOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorUsernameStatus linphone_account_creator_set_display_name(LinphoneAccountCreator *creator, const char *display_name);
+
+/**
+ * Get the display name.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The display name of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_display_name(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the email.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] email The email to set
+ * @return #LinphoneAccountCreatorEmailStatusOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorEmailStatus linphone_account_creator_set_email(LinphoneAccountCreator *creator, const char *email);
+
+/**
+ * Get the email.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The email of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_email(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the domain.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] domain The domain to set
+ * @return #LinphoneAccountCreatorDomainOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorDomainStatus linphone_account_creator_set_domain(LinphoneAccountCreator *creator, const char *domain);
+
+/**
+ * Get the domain.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The domain of the #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC const char * linphone_account_creator_get_domain(const LinphoneAccountCreator *creator);
+
+/**
+ * Set Transport
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] transport The transport to set
+ * @return #LinphoneAccountCreatorTransportOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorTransportStatus linphone_account_creator_set_transport(LinphoneAccountCreator *creator, LinphoneTransportType transport);
+
+/**
+ * get Transport
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The transport of #LinphoneAccountCreator
+**/
+LINPHONE_PUBLIC LinphoneTransportType linphone_account_creator_get_transport(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the route.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] route The route to set
+ * @return #LinphoneAccountCreatorStatusRequestOk if everything is OK, or a specific error otherwise.
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_set_route(LinphoneAccountCreator *creator, const char *route);
+
+/**
+ * Get the route.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The route of the #LinphoneAccountCreator
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC const char * linphone_account_creator_get_route(const LinphoneAccountCreator *creator);
+
+/**
+ * Set the set_as_default property.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] set_as_default The set_as_default to set
+ * @return #LinphoneAccountCreatorStatusRequestOk if everything is OK, or a specific error otherwise.
+ **/
+LINPHONE_PUBLIC LinphoneAccountCreatorStatus linphone_account_creator_set_as_default(LinphoneAccountCreator *creator, bool_t set_as_default);
+
+/**
+ * Get the set_as_default property.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The set_as_default of the #LinphoneAccountCreator
+ **/
+LINPHONE_PUBLIC bool_t linphone_account_creator_get_set_as_default(const LinphoneAccountCreator *creator);
+
+/**
+ * Get the #LinphoneAccountCreatorCbs object associated with a LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The #LinphoneAccountCreatorCbs object associated with the LinphoneAccountCreator.
+ * @deprecated use add_callbacks / remove_callbacks instead
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbs * linphone_account_creator_get_callbacks(const LinphoneAccountCreator *creator);
+
+/**
+ * Add the #LinphoneAccountCreatorCbs object to a LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] cbs The #LinphoneAccountCreatorCbs object to add to the LinphoneAccountCreator.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_add_callbacks(LinphoneAccountCreator *creator, LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Removes the #LinphoneAccountCreatorCbs object from a LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @param[in] cbs The #LinphoneAccountCreatorCbs object to remove from the LinphoneAccountCreator.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_remove_callbacks(LinphoneAccountCreator *creator, LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Get the current #LinphoneAccountCreatorCbs object associated with a LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The current #LinphoneAccountCreatorCbs object associated with the LinphoneAccountCreator.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbs *linphone_account_creator_get_current_callbacks(const LinphoneAccountCreator *creator);
+
+/**
+ * Get the #LinphoneAccountCreatorService object associated with a LinphoneAccountCreator.
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return The #LinphoneAccountCreatorService object associated with the LinphoneAccountCreator.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorService * linphone_account_creator_get_service(const LinphoneAccountCreator *creator);
+
+/************************** End Account Creator data **************************/
+
+/************************** Start Account Creator Cbs **************************/
+
+/**
+ * Acquire a reference to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The same #LinphoneAccountCreatorCbs object.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbs * linphone_account_creator_cbs_ref(LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Release a reference to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_unref(LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Retrieve the user pointer associated with a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The user pointer associated with the #LinphoneAccountCreatorCbs object.
+**/
+LINPHONE_PUBLIC void *linphone_account_creator_cbs_get_user_data(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] ud The user pointer to associate with the #LinphoneAccountCreatorCbs object.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_user_data(LinphoneAccountCreatorCbs *cbs, void *ud);
+
+/**
+ * Get the create account request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current create account request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_create_account(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The create account request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_create_account(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the is account exist request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current is account exist request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_account_exist(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The is account exist request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_is_account_exist(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the activate account request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current activate account request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_activate_account(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The activate account request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_activate_account(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the is account activated request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current is account activated request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_account_activated(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The is account activated request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_is_account_activated(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the link account request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current link account request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_link_account(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The link account request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_link_account(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the activate alias request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current link account request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_activate_alias(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The activate alias request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_activate_alias(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the is alias used request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current is alias used request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_alias_used(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The is alias used request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_is_alias_used(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the is account linked request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current is account linked request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_is_account_linked(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The is account linked request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_is_account_linked(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the recover account request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current recover account request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_recover_account(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The recover account request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_recover_account(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/**
+ * Get the update account request.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @return The current update account request.
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorCbsStatusCb linphone_account_creator_cbs_get_update_account(const LinphoneAccountCreatorCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorCbs object.
+ * @param[in] cbs #LinphoneAccountCreatorCbs object.
+ * @param[in] cb The update account request to be used.
+**/
+LINPHONE_PUBLIC void linphone_account_creator_cbs_set_update_account(LinphoneAccountCreatorCbs *cbs, LinphoneAccountCreatorCbsStatusCb cb);
+
+/************************** End Account Creator Cbs **************************/
+
+/**
+ * Create and configure a proxy config and a authentication info for an account creator
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return A #LinphoneProxyConfig object if successful, NULL otherwise
+**/
+LINPHONE_PUBLIC LinphoneProxyConfig * linphone_account_creator_create_proxy_config(const LinphoneAccountCreator *creator);
+
+/**
+ * Configure an account (create a proxy config and authentication info for it).
+ * @param[in] creator #LinphoneAccountCreator object
+ * @return A #LinphoneProxyConfig object if successful, NULL otherwise
+ * @deprecated Use linphone_account_creator_create_proxy_config instead
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneProxyConfig * linphone_account_creator_configure(const LinphoneAccountCreator *creator);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_ACCOUNT_CREATOR_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/account_creator_service.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/account_creator_service.h"
new file mode 100644
index 0000000..5cb224b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/account_creator_service.h"
@@ -0,0 +1,282 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_ACCOUNT_CREATOR_SERVICE_H_
+#define LINPHONE_ACCOUNT_CREATOR_SERVICE_H_
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Function to set custom server request.
+ * @param[in] creator #LinphoneAccountCreator object
+ */
+typedef LinphoneAccountCreatorStatus (*LinphoneAccountCreatorRequestFunc)(LinphoneAccountCreator *creator);
+
+/**
+ * @addtogroup account_creator_request
+ * @{
+ */
+
+/************************** Start Account Creator Requests **************************/
+
+/**
+ * Create a new #LinphoneAccountCreatorService object.
+ * @return a new #LinphoneAccountCreatorService object.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorService * linphone_account_creator_service_new(void);
+
+/**
+ * Acquire a reference to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The same #LinphoneAccountCreatorService object.
+ * @donotwrap
+**/
+LinphoneAccountCreatorService * linphone_account_creator_service_ref(LinphoneAccountCreatorService *service);
+
+/**
+ * Release a reference to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @donotwrap
+**/
+void linphone_account_creator_service_unref(LinphoneAccountCreatorService *service);
+
+/**
+ * Retrieve the user pointer associated with a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The user pointer associated with the #LinphoneAccountCreatorService object.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void *linphone_account_creator_service_get_user_data(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] ud The user pointer to associate with the #LinphoneAccountCreatorService object.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_user_data(LinphoneAccountCreatorService *service, void *ud);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The constructor of account creator requests.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_constructor_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the constructor of account creator requests.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current constructor of create account request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_constructor_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The destructor.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_destructor_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the destructor of create account request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current destructor of create account request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_destructor_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Get the create account request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current create account request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_create_account_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The create account request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_create_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the is account exist request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current is account exist request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_is_account_exist_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The is account exist request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_is_account_exist_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the activate account request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current activate account request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_activate_account_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The activate account request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_activate_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the is account activated request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current is account activated request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_is_account_activated_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The is account activated request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_is_account_activated_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the link account request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current link account request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_link_account_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The link account request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_link_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the activate alias request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current link account request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_activate_alias_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The activate alias request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_activate_alias_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the is alias used request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current is alias used request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_is_alias_used_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The is alias used request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_is_alias_used_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the is account linked request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current is account linked request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_is_account_linked_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The is account linked request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_is_account_linked_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the recover account request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current recover account request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_recover_account_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The recover account request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_recover_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/**
+ * Get the update account request.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @return The current update account request.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorRequestFunc linphone_account_creator_service_get_update_account_cb(const LinphoneAccountCreatorService *service);
+
+/**
+ * Assign a user pointer to a #LinphoneAccountCreatorService object.
+ * @param[in] service #LinphoneAccountCreatorService object.
+ * @param[in] cb The update account request to be used.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_account_creator_service_set_update_account_cb(LinphoneAccountCreatorService *service, LinphoneAccountCreatorRequestFunc cb);
+
+/************************** End Account Creator Requests **************************/
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @}
+ */
+
+#endif /* LINPHONE_ACCOUNT_CREATOR_SERVICE_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-address.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-address.h"
new file mode 100644
index 0000000..80b1241
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-address.h"
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_ADDRESS_H_
+#define _L_C_ADDRESS_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup linphone_address
+ * @{
+ */
+
+/**
+ * Constructs a #LinphoneAddress object by parsing the user supplied address,
+ * given as a string.
+ **/
+LINPHONE_PUBLIC LinphoneAddress *linphone_address_new (const char *address);
+
+/**
+ * Clones a #LinphoneAddress object.
+ **/
+LINPHONE_PUBLIC LinphoneAddress *linphone_address_clone (const LinphoneAddress *address);
+
+/**
+ * Increment reference count of #LinphoneAddress object.
+ **/
+LINPHONE_PUBLIC LinphoneAddress *linphone_address_ref (LinphoneAddress *address);
+
+/**
+ * Decrement reference count of #LinphoneAddress object. When dropped to zero, memory is freed.
+ **/
+LINPHONE_PUBLIC void linphone_address_unref (LinphoneAddress *address);
+
+/**
+ * Returns the address scheme, normally "sip".
+ **/
+LINPHONE_PUBLIC const char *linphone_address_get_scheme (const LinphoneAddress *address);
+
+/**
+ * Returns the display name.
+ **/
+LINPHONE_PUBLIC const char *linphone_address_get_display_name (const LinphoneAddress *address);
+
+/**
+ * Sets the display name.
+ **/
+LINPHONE_PUBLIC LinphoneStatus linphone_address_set_display_name (LinphoneAddress *address, const char *display_name);
+
+/**
+ * Returns the username.
+ **/
+LINPHONE_PUBLIC const char *linphone_address_get_username (const LinphoneAddress *address);
+
+/**
+ * Sets the username.
+ **/
+LINPHONE_PUBLIC LinphoneStatus linphone_address_set_username (LinphoneAddress *address, const char *username);
+
+/**
+ * Returns the domain name.
+ **/
+LINPHONE_PUBLIC const char *linphone_address_get_domain (const LinphoneAddress *address);
+
+/**
+ * Sets the domain.
+ **/
+LINPHONE_PUBLIC LinphoneStatus linphone_address_set_domain (LinphoneAddress *address, const char *domain);
+
+/**
+ * Get port number as an integer value, 0 if not present.
+ */
+LINPHONE_PUBLIC int linphone_address_get_port (const LinphoneAddress *address);
+
+/**
+ * Sets the port number.
+ **/
+LINPHONE_PUBLIC LinphoneStatus linphone_address_set_port (LinphoneAddress *address, int port);
+
+/**
+ * Get the transport.
+ **/
+LINPHONE_PUBLIC LinphoneTransportType linphone_address_get_transport (const LinphoneAddress *address);
+
+/**
+ * Set a transport.
+ **/
+LINPHONE_PUBLIC LinphoneStatus linphone_address_set_transport (LinphoneAddress *address, LinphoneTransportType transport);
+
+/**
+ * Returns true if address refers to a secure location (sips)
+ **/
+LINPHONE_PUBLIC bool_t linphone_address_get_secure (const LinphoneAddress *address);
+
+/**
+ * Make the address refer to a secure location (sips scheme)
+ * @param[in] address A #LinphoneAddress object
+ * @param[in] enabled TRUE if address is requested to be secure.
+ **/
+LINPHONE_PUBLIC void linphone_address_set_secure (LinphoneAddress *address, bool_t enabled);
+
+/**
+ * returns true if address is a routable sip address
+ */
+LINPHONE_PUBLIC bool_t linphone_address_is_sip (const LinphoneAddress *address);
+
+/**
+ * Get the value of the method parameter
+ **/
+LINPHONE_PUBLIC const char *linphone_address_get_method_param (const LinphoneAddress *address);
+
+/**
+ * Set the value of the method parameter
+ **/
+LINPHONE_PUBLIC void linphone_address_set_method_param (LinphoneAddress *address, const char *method_param);
+
+/**
+ * Get the password encoded in the address.
+ * It is used for basic authentication (not recommended).
+ * @param address the address
+ * @return the password, if any, NULL otherwise.
+ **/
+LINPHONE_PUBLIC const char *linphone_address_get_password (const LinphoneAddress *address);
+
+/**
+ * Set the password encoded in the address.
+ * It is used for basic authentication (not recommended).
+ * @param address the #LinphoneAddress
+ * @param password the password to set.
+ **/
+LINPHONE_PUBLIC void linphone_address_set_password (LinphoneAddress *address, const char *password);
+
+/**
+ * Removes address's tags and uri headers so that it is displayable to the user.
+ **/
+LINPHONE_PUBLIC void linphone_address_clean (LinphoneAddress *address);
+
+/**
+ * Returns the address as a string.
+ * The returned char * must be freed by the application. Use ms_free().
+ **/
+LINPHONE_PUBLIC char *linphone_address_as_string (const LinphoneAddress *address);
+
+/**
+ * Returns the SIP uri only as a string, that is display name is removed.
+ * The returned char * must be freed by the application. Use ms_free().
+ **/
+LINPHONE_PUBLIC char *linphone_address_as_string_uri_only (const LinphoneAddress *address);
+
+/**
+ * Compare two #LinphoneAddress ignoring tags and headers, basically just domain, username, and port.
+ * @param[in] address1 #LinphoneAddress object
+ * @param[in] address2 #LinphoneAddress object
+ * @return Boolean value telling if the #LinphoneAddress objects are equal.
+ * @see linphone_address_equal()
+ **/
+LINPHONE_PUBLIC bool_t linphone_address_weak_equal (const LinphoneAddress *address1, const LinphoneAddress *address2);
+
+/**
+ * Compare two #LinphoneAddress taking the tags and headers into account.
+ * @param[in] address1 #LinphoneAddress object
+ * @param[in] address2 #LinphoneAddress object
+ * @return Boolean value telling if the #LinphoneAddress objects are equal.
+ * @see linphone_address_weak_equal()
+ */
+LINPHONE_PUBLIC bool_t linphone_address_equal (const LinphoneAddress *address1, const LinphoneAddress *address2);
+
+/**
+ * Get the header encoded in the address.
+ * @param header_name the header name
+**/
+LINPHONE_PUBLIC const char *linphone_address_get_header (const LinphoneAddress *address, const char *header_name);
+
+/**
+ * Set a header into the address.
+ * Headers appear in the URI with '?', such as \<sip:test@linphone.org?SomeHeader=SomeValue\>.
+ * @param address the address
+ * @param header_name the header name
+ * @param header_value the header value
+ **/
+LINPHONE_PUBLIC void linphone_address_set_header (LinphoneAddress *address, const char *header_name, const char *header_value);
+
+/**
+ * Tell whether a parameter is present in the address
+ * @param[in] address #LinphoneAddress object
+ * @param[in] param_name The name of the parameter
+ * @return A boolean value telling whether the parameter is present in the address
+ */
+LINPHONE_PUBLIC bool_t linphone_address_has_param (const LinphoneAddress *address, const char *param_name);
+
+/**
+ * Get the value of a parameter of the address
+ * @param[in] address #LinphoneAddress object
+ * @param[in] param_name The name of the parameter
+ * @return The value of the parameter
+ */
+LINPHONE_PUBLIC const char *linphone_address_get_param (const LinphoneAddress *address, const char *param_name);
+
+/**
+ * Set the value of a parameter of the address
+ * @param[in] address #LinphoneAddress object
+ * @param[in] param_name The name of the parameter
+ * @param[in] param_value The new value of the parameter
+ */
+LINPHONE_PUBLIC void linphone_address_set_param (LinphoneAddress *address, const char *param_name, const char *param_value);
+
+LINPHONE_PUBLIC void linphone_address_set_params (LinphoneAddress *address, const char *params);
+
+/**
+ * Tell whether a parameter is present in the URI of the address
+ * @param[in] address #LinphoneAddress object
+ * @param[in] uri_param_name The name of the parameter
+ * @return A boolean value telling whether the parameter is present in the URI of the address
+ */
+LINPHONE_PUBLIC bool_t linphone_address_has_uri_param (const LinphoneAddress *address, const char *uri_param_name);
+
+/**
+ * Get the value of a parameter of the URI of the address
+ * @param[in] address #LinphoneAddress object
+ * @param[in] uri_param_name The name of the parameter
+ * @return The value of the parameter
+ */
+LINPHONE_PUBLIC const char *linphone_address_get_uri_param (const LinphoneAddress *address, const char *uri_param_name);
+
+/**
+ * Set the value of a parameter of the URI of the address
+ * @param[in] address #LinphoneAddress object
+ * @param[in] uri_param_name The name of the parameter
+ * @param[in] uri_param_value The new value of the parameter
+ */
+LINPHONE_PUBLIC void linphone_address_set_uri_param (LinphoneAddress *address, const char *uri_param_name, const char *uri_param_value);
+
+LINPHONE_PUBLIC void linphone_address_set_uri_params (LinphoneAddress *address, const char *params);
+
+/**
+ * Removes the value of a parameter of the URI of the address
+ * @param[in] address #LinphoneAddress object
+ * @param[in] uri_param_name The name of the parameter
+ */
+LINPHONE_PUBLIC void linphone_address_remove_uri_param (LinphoneAddress *address, const char *uri_param_name);
+
+/**
+ * Destroys a #LinphoneAddress object (actually calls linphone_address_unref()).
+ * @deprecated Use linphone_address_unref() instead
+ * @donotwrap
+ **/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_address_destroy (LinphoneAddress *address);
+
+/**
+ * Returns true if address refers to a secure location (sips)
+ * @deprecated use linphone_address_get_secure()
+ * @donotwrap
+ **/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC bool_t linphone_address_is_secure (const LinphoneAddress *address);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_ADDRESS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-api.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-api.h"
new file mode 100644
index 0000000..67e667a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-api.h"
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_API_H_
+#define _L_C_API_H_
+
+#include "linphone/utils/general.h"
+
+#include "linphone/api/c-auth-info.h"
+#include "linphone/api/c-address.h"
+#include "linphone/api/c-call-cbs.h"
+#include "linphone/api/c-call-stats.h"
+#include "linphone/api/c-call.h"
+#include "linphone/api/c-callbacks.h"
+#include "linphone/api/c-chat-message-cbs.h"
+#include "linphone/api/c-chat-message.h"
+#include "linphone/api/c-chat-room-cbs.h"
+#include "linphone/api/c-chat-room.h"
+#include "linphone/api/c-content.h"
+#include "linphone/api/c-dial-plan.h"
+#include "linphone/api/c-event-log.h"
+#include "linphone/api/c-magic-search.h"
+#include "linphone/api/c-participant-imdn-state.h"
+#include "linphone/api/c-participant.h"
+#include "linphone/api/c-participant-device.h"
+#include "linphone/api/c-participant-device-identity.h"
+#include "linphone/api/c-search-result.h"
+#include "linphone/api/c-types.h"
+
+#endif // ifndef _L_C_API_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-auth-info.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-auth-info.h"
new file mode 100644
index 0000000..5d47c1d
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-auth-info.h"
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_AUTH_INFO_H
+#define LINPHONE_AUTH_INFO_H
+
+#include "linphone/api/c-types.h"
+
+/**
+ * @addtogroup authentication
+ * @{
+ */
+
+/**
+ * Safely cast a belle_sip_object_t into #LinphoneAuthInfo
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LINPHONE_PUBLIC LinphoneAuthInfo *linphone_auth_info_new(
+	const char *username,
+	const char *userid,
+	const char *passwd,
+	const char *ha1,
+	const char *rfealm,
+	const char *domain);
+
+LINPHONE_PUBLIC LinphoneAuthInfo *linphone_auth_info_new_for_algorithm(
+	const char *username,
+	const char *userid,
+	const char *passwd,
+	const char *ha1,
+	const char *realm,
+	const char *domain,
+	const char *algorithm);
+/**
+ * Instantiates a new auth info with values from source.
+ * @param[in] source The #LinphoneAuthInfo object to be cloned
+ * @return The newly created #LinphoneAuthInfo object.
+ */
+LINPHONE_PUBLIC LinphoneAuthInfo *linphone_auth_info_clone(const LinphoneAuthInfo *source);
+
+/**
+ * Take a reference on a #LinphoneAuthInfo.
+ */
+LINPHONE_PUBLIC LinphoneAuthInfo *linphone_auth_info_ref(LinphoneAuthInfo *info);
+
+/**
+ * Release a #LinphoneAuthInfo.
+ */
+LINPHONE_PUBLIC void linphone_auth_info_unref(LinphoneAuthInfo *info);
+
+/**
+ * Sets the password.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] passwd The password.
+ * @deprecated, use linphone_auth_info_set_password instead
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_passwd(LinphoneAuthInfo *info, const char *passwd);
+
+/**
+ * Sets the password.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] passwd The password.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_password(LinphoneAuthInfo *info, const char *passwd);
+
+/**
+ * Sets the username.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] username The username.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_username(LinphoneAuthInfo *info, const char *username);
+
+/**
+ * Sets the algorithm.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] algorithm The algorithm.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_algorithm(LinphoneAuthInfo *info, const char *algorithm);
+
+/**
+ * Sets the userid.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] userid The userid.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_userid(LinphoneAuthInfo *info, const char *userid);
+
+/**
+ * Sets the realm.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] realm The realm.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_realm(LinphoneAuthInfo *info, const char *realm);
+
+/**
+ * Sets the domain for which this authentication is valid.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] domain The domain.
+ * This should not be necessary because realm is supposed to be unique and sufficient.
+ * However, many SIP servers don't set realm correctly, then domain has to be used to distinguish between several SIP account bearing the same username.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_domain(LinphoneAuthInfo *info, const char *domain);
+
+/**
+ * Sets the ha1.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] ha1 The ha1.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_ha1(LinphoneAuthInfo *info, const char *ha1);
+
+/**
+ * Sets the TLS certificate.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] tls_cert The TLS certificate.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_tls_cert(LinphoneAuthInfo *info, const char *tls_cert);
+
+/**
+ * Sets the TLS key.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] tls_key The TLS key.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_tls_key(LinphoneAuthInfo *info, const char *tls_key);
+
+/**
+ * Sets the TLS certificate path.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] tls_cert_path The TLS certificate path.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_tls_cert_path(LinphoneAuthInfo *info, const char *tls_cert_path);
+
+/**
+ * Sets the TLS key path.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @param[in] tls_key_path The TLS key path.
+**/
+LINPHONE_PUBLIC void linphone_auth_info_set_tls_key_path(LinphoneAuthInfo *info, const char *tls_key_path);
+
+/**
+ * Gets the username.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The username.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_username(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the algorithm.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The algorithm.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_algorithm(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the password.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The password.
+ * @deprecated, use linphone_auth_info_get_password instead
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_passwd(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the password.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The password.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_password(const LinphoneAuthInfo *info);
+
+
+/**
+ * Gets the userid.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The userid.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_userid(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the realm.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The realm.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_realm(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the domain.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The domain.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_domain(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the ha1.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The ha1.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_ha1(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the TLS certificate.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The TLS certificate.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_tls_cert(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the TLS key.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The TLS key.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_tls_key(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the TLS certificate path.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The TLS certificate path.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_tls_cert_path(const LinphoneAuthInfo *info);
+
+/**
+ * Gets the TLS key path.
+ * @param[in] info The #LinphoneAuthInfo object
+ * @return The TLS key path.
+ */
+LINPHONE_PUBLIC const char *linphone_auth_info_get_tls_key_path(const LinphoneAuthInfo *info);
+
+/* you don't need those function*/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_auth_info_destroy(LinphoneAuthInfo *info);
+
+void linphone_auth_info_write_config(LpConfig *config, LinphoneAuthInfo *obj, int pos);
+
+LinphoneAuthInfo *linphone_auth_info_new_from_config_file(LpConfig *config, int pos);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_AUTH_INFO_H */
\ No newline at end of file
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call-cbs.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call-cbs.h"
new file mode 100644
index 0000000..63fdda4
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call-cbs.h"
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CALL_CBS_H_
+#define _L_C_CALL_CBS_H_
+
+#include "linphone/api/c-callbacks.h"
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup call_control
+ * @{
+ */
+
+/**
+ * Acquire a reference to the #LinphoneCallCbs object.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The same #LinphoneCallCbs object.
+ */
+LINPHONE_PUBLIC LinphoneCallCbs *linphone_call_cbs_ref (LinphoneCallCbs *cbs);
+
+/**
+ * Release reference to the #LinphoneCallCbs object.
+ * @param[in] cbs #LinphoneCallCbs object.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_unref (LinphoneCallCbs *cbs);
+
+/**
+ * Retrieve the user pointer associated with the #LinphoneCallCbs object.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The user pointer associated with the #LinphoneCallCbs object.
+ */
+LINPHONE_PUBLIC void *linphone_call_cbs_get_user_data (const LinphoneCallCbs *cbs);
+
+/**
+ * Assign a user pointer to the #LinphoneCallCbs object.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] ud The user pointer to associate with the #LinphoneCallCbs object.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_user_data (LinphoneCallCbs *cbs, void *ud);
+
+/**
+ * Get the dtmf received callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The current dtmf received callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsDtmfReceivedCb linphone_call_cbs_get_dtmf_received (LinphoneCallCbs *cbs);
+
+/**
+ * Set the dtmf received callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] cb The dtmf received callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_dtmf_received (LinphoneCallCbs *cbs, LinphoneCallCbsDtmfReceivedCb cb);
+
+/**
+ * Get the encryption changed callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The current encryption changed callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsEncryptionChangedCb linphone_call_cbs_get_encryption_changed (LinphoneCallCbs *cbs);
+
+/**
+ * Set the encryption changed callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] cb The encryption changed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_encryption_changed (LinphoneCallCbs *cbs, LinphoneCallCbsEncryptionChangedCb cb);
+
+/**
+ * Get the info message received callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The current info message received callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsInfoMessageReceivedCb linphone_call_cbs_get_info_message_received (LinphoneCallCbs *cbs);
+
+/**
+ * Set the info message received callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] cb The info message received callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_info_message_received (LinphoneCallCbs *cbs, LinphoneCallCbsInfoMessageReceivedCb cb);
+
+/**
+ * Get the state changed callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The current state changed callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsStateChangedCb linphone_call_cbs_get_state_changed (LinphoneCallCbs *cbs);
+
+/**
+ * Set the state changed callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] cb The state changed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_state_changed (LinphoneCallCbs *cbs, LinphoneCallCbsStateChangedCb cb);
+
+/**
+ * Get the stats updated callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The current stats updated callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsStatsUpdatedCb linphone_call_cbs_get_stats_updated (LinphoneCallCbs *cbs);
+
+/**
+ * Set the stats updated callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] cb The stats updated callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_stats_updated (LinphoneCallCbs *cbs, LinphoneCallCbsStatsUpdatedCb cb);
+
+/**
+ * Get the transfer state changed callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The current transfer state changed callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsTransferStateChangedCb linphone_call_cbs_get_transfer_state_changed (LinphoneCallCbs *cbs);
+
+/**
+ * Set the transfer state changed callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] cb The transfer state changed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_transfer_state_changed (LinphoneCallCbs *cbs, LinphoneCallCbsTransferStateChangedCb cb);
+
+/**
+ * Get the ACK processing callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @return The current ack processing callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsAckProcessingCb linphone_call_cbs_get_ack_processing (LinphoneCallCbs *cbs);
+
+/**
+ * Set ACK processing callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] cb The ack processing callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_ack_processing (LinphoneCallCbs *cbs, LinphoneCallCbsAckProcessingCb cb);
+
+/**
+ * Get the TMMBR received callback.
+ * @param[in] cbs LinphoneCallCbs object.
+ * @return The current TMMBR received callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsTmmbrReceivedCb linphone_call_cbs_get_tmmbr_received(LinphoneCallCbs *cbs);
+
+/**
+ * Set the TMMBR received callback.
+ * @param[in] cbs LinphoneCallCbs object.
+ * @param[in] cb The TMMBR received callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_tmmbr_received(LinphoneCallCbs *cbs, LinphoneCallCbsTmmbrReceivedCb cb);
+
+/**
+ * Get the snapshot taken callback.
+ * @param[in] cbs LinphoneCallCbs object.
+ * @return The current snapshot taken callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsSnapshotTakenCb linphone_call_cbs_get_snapshot_taken(LinphoneCallCbs *cbs);
+
+/**
+ * Set the snapshot taken callback.
+ * @param[in] cbs LinphoneCallCbs object.
+ * @param[in] cb The snapshot taken callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_snapshot_taken(LinphoneCallCbs *cbs, LinphoneCallCbsSnapshotTakenCb cb);
+
+ /**
+ * Get the next video frame decoded callback.
+ * @param[in] cbs LinphoneCallCbs object.
+ * @return The current next video frame decoded callback.
+ */
+LINPHONE_PUBLIC LinphoneCallCbsNextVideoFrameDecodedCb linphone_call_cbs_get_next_video_frame_decoded(LinphoneCallCbs *cbs);
+
+/**
+ * Set the next video frame decoded callback.
+ * @param[in] cbs LinphoneCallCbs object.
+ * @param[in] cb The next video frame decoded callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_call_cbs_set_next_video_frame_decoded(LinphoneCallCbs *cbs, LinphoneCallCbsNextVideoFrameDecodedCb cb);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CALL_CBS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call-stats.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call-stats.h"
new file mode 100644
index 0000000..745ad13
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call-stats.h"
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CALL_STATS_H_
+#define _L_C_CALL_STATS_H_
+
+#include <ortp/rtp.h>
+
+#include "linphone/api/c-callbacks.h"
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup call_misc
+ * @{
+ */
+
+#define LINPHONE_CALL_STATS_AUDIO ((int)LinphoneStreamTypeAudio)
+#define LINPHONE_CALL_STATS_VIDEO ((int)LinphoneStreamTypeVideo)
+#define LINPHONE_CALL_STATS_TEXT  ((int)LinphoneStreamTypeText)
+
+#define LINPHONE_CALL_STATS_RECEIVED_RTCP_UPDATE (1 << 0) /**< received_rtcp field of LinphoneCallStats object has been updated */
+#define LINPHONE_CALL_STATS_SENT_RTCP_UPDATE (1 << 1) /**< sent_rtcp field of LinphoneCallStats object has been updated */
+#define LINPHONE_CALL_STATS_PERIODICAL_UPDATE (1 << 2) /**< Every seconds LinphoneCallStats object has been updated */
+
+/**
+ * Increment refcount.
+ * @param[in] stats #LinphoneCallStats object
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneCallStats *linphone_call_stats_ref (LinphoneCallStats *stats);
+
+/**
+ * Decrement refcount and possibly free the object.
+ * @param[in] stats #LinphoneCallStats object
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC void linphone_call_stats_unref (LinphoneCallStats *stats);
+
+/**
+ * Gets the user data in the #LinphoneCallStats object
+ * @param[in] stats the #LinphoneCallStats
+ * @return the user data
+ * @ingroup misc
+*/
+LINPHONE_PUBLIC void *linphone_call_stats_get_user_data (const LinphoneCallStats *stats);
+
+/**
+ * Sets the user data in the #LinphoneCallStats object
+ * @param[in] stats the #LinphoneCallStats object
+ * @param[in] data the user data
+ * @ingroup misc
+*/
+LINPHONE_PUBLIC void linphone_call_stats_set_user_data (LinphoneCallStats *stats, void *data);
+
+/**
+ * Get the type of the stream the stats refer to.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The type of the stream the stats refer to
+ */
+LINPHONE_PUBLIC LinphoneStreamType linphone_call_stats_get_type (const LinphoneCallStats *stats);
+
+/**
+ * Get the local loss rate since last report
+ * @return The sender loss rate
+**/
+LINPHONE_PUBLIC float linphone_call_stats_get_sender_loss_rate (const LinphoneCallStats *stats);
+
+/**
+ * Gets the remote reported loss rate since last report
+ * @return The receiver loss rate
+**/
+LINPHONE_PUBLIC float linphone_call_stats_get_receiver_loss_rate (const LinphoneCallStats *stats);
+
+/**
+ * Get the local loss rate since last report
+ * @return The local loss rate
+**/
+LINPHONE_PUBLIC float linphone_call_stats_get_local_loss_rate (const LinphoneCallStats *stats);
+
+/**
+ * Gets the local late rate since last report
+ * @return The local late rate
+**/
+LINPHONE_PUBLIC float linphone_call_stats_get_local_late_rate (const LinphoneCallStats *stats);
+
+/**
+ * Gets the local interarrival jitter
+ * @param[in] stats #LinphoneCallStats object
+ * @return The interarrival jitter at last emitted sender report
+**/
+LINPHONE_PUBLIC float linphone_call_stats_get_sender_interarrival_jitter (const LinphoneCallStats *stats);
+
+/**
+ * Gets the remote reported interarrival jitter
+ * @param[in] stats #LinphoneCallStats object
+ * @return The interarrival jitter at last received receiver report
+**/
+LINPHONE_PUBLIC float linphone_call_stats_get_receiver_interarrival_jitter (const LinphoneCallStats *stats);
+
+LINPHONE_PUBLIC const rtp_stats_t *linphone_call_stats_get_rtp_stats (const LinphoneCallStats *stats);
+
+/**
+ * Gets the cumulative number of late packets
+ * @param[in] stats #LinphoneCallStats object
+ * @return The cumulative number of late packets
+**/
+LINPHONE_PUBLIC uint64_t linphone_call_stats_get_late_packets_cumulative_number (const LinphoneCallStats *stats);
+
+/**
+ * Get the bandwidth measurement of the received stream, expressed in kbit/s, including IP/UDP/RTP headers.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The bandwidth measurement of the received stream in kbit/s.
+ */
+LINPHONE_PUBLIC float linphone_call_stats_get_download_bandwidth (const LinphoneCallStats *stats);
+
+/**
+ * Get the bandwidth measurement of the sent stream, expressed in kbit/s, including IP/UDP/RTP headers.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The bandwidth measurement of the sent stream in kbit/s.
+ */
+LINPHONE_PUBLIC float linphone_call_stats_get_upload_bandwidth (const LinphoneCallStats *stats);
+
+/**
+ * Get the bandwidth measurement of the received RTCP, expressed in kbit/s, including IP/UDP/RTP headers.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The bandwidth measurement of the received RTCP in kbit/s.
+ */
+LINPHONE_PUBLIC float linphone_call_stats_get_rtcp_download_bandwidth (const LinphoneCallStats *stats);
+
+/**
+ * Get the bandwidth measurement of the sent RTCP, expressed in kbit/s, including IP/UDP/RTP headers.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The bandwidth measurement of the sent RTCP in kbit/s.
+ */
+LINPHONE_PUBLIC float linphone_call_stats_get_rtcp_upload_bandwidth( const LinphoneCallStats *stats);
+
+/**
+ * Get the state of ICE processing.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The state of ICE processing.
+ */
+LINPHONE_PUBLIC LinphoneIceState linphone_call_stats_get_ice_state (const LinphoneCallStats *stats);
+
+/**
+ * Get the state of uPnP processing.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The state of uPnP processing.
+ */
+LINPHONE_PUBLIC LinphoneUpnpState linphone_call_stats_get_upnp_state (const LinphoneCallStats *stats);
+
+/**
+ * Get the IP address family of the remote peer.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The IP address family of the remote peer.
+ */
+LINPHONE_PUBLIC LinphoneAddressFamily linphone_call_stats_get_ip_family_of_remote (const LinphoneCallStats *stats);
+
+/**
+ * Get the jitter buffer size in ms.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The jitter buffer size in ms.
+ */
+LINPHONE_PUBLIC float linphone_call_stats_get_jitter_buffer_size_ms (const LinphoneCallStats *stats);
+
+/**
+ * Get the round trip delay in s.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The round trip delay in s.
+ */
+LINPHONE_PUBLIC float linphone_call_stats_get_round_trip_delay (const LinphoneCallStats *stats);
+
+/**
+ * Get the estimated bandwidth measurement of the received stream, expressed in kbit/s, including IP/UDP/RTP headers.
+ * @param[in] stats #LinphoneCallStats object
+ * @return The estimated bandwidth measurement of the received stream in kbit/s.
+ */
+LINPHONE_PUBLIC float linphone_call_stats_get_estimated_download_bandwidth(const LinphoneCallStats *stats);
+
+void linphone_call_stats_set_estimated_download_bandwidth(LinphoneCallStats *stats, float estimated_value);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CALL_STATS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call.h"
new file mode 100644
index 0000000..2fc190c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-call.h"
@@ -0,0 +1,844 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CALL_H_
+#define _L_C_CALL_H_
+
+#include <ortp/rtpsession.h>
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup call_control
+ * @{
+ */
+
+/**
+ * Acquire a reference to the call.
+ * An application that wishes to retain a pointer to call object
+ * must use this function to unsure the pointer remains
+ * valid. Once the application no more needs this pointer,
+ * it must call linphone_call_unref().
+ * @param[in] call The call.
+ * @return The same call.
+**/
+LINPHONE_PUBLIC LinphoneCall *linphone_call_ref (LinphoneCall *call);
+
+/**
+ * Release reference to the call.
+ * @param[in] call The call.
+**/
+LINPHONE_PUBLIC void linphone_call_unref (LinphoneCall *call);
+
+/**
+ * Retrieve the user pointer associated with the call.
+ * @param[in] call The call.
+ * @return The user pointer associated with the call.
+**/
+LINPHONE_PUBLIC void *linphone_call_get_user_data (const LinphoneCall *call);
+
+/**
+ * Assign a user pointer to the call.
+ * @param[in] call The call.
+ * @param[in] ud The user pointer to associate with the call.
+**/
+LINPHONE_PUBLIC void linphone_call_set_user_data (LinphoneCall *call, void *ud);
+
+/**
+ * Get the core that has created the specified call.
+ * @param[in] call #LinphoneCall object
+ * @return The #LinphoneCore object that has created the specified call.
+ */
+LINPHONE_PUBLIC LinphoneCore * linphone_call_get_core (const LinphoneCall *call);
+
+/**
+ * Retrieves the call's current state.
+**/
+LINPHONE_PUBLIC LinphoneCallState linphone_call_get_state (const LinphoneCall *call);
+
+/**
+ * Tell whether a call has been asked to autoanswer
+ * @param[in] call #LinphoneCall object
+ * @return A boolean value telling whether the call has been asked to autoanswer
+**/
+LINPHONE_PUBLIC bool_t linphone_call_asked_to_autoanswer (LinphoneCall *call);
+
+/**
+ * Returns the remote address associated to this call
+**/
+LINPHONE_PUBLIC const LinphoneAddress *linphone_call_get_remote_address (const LinphoneCall *call);
+
+/**
+ * Returns the to address with its headers associated to this call
+**/
+LINPHONE_PUBLIC const LinphoneAddress *linphone_call_get_to_address (const LinphoneCall * call);
+
+/**
+ * Returns the value of the header name
+**/
+LINPHONE_PUBLIC const char *linphone_call_get_to_header (const LinphoneCall *call, const char *name);
+
+/**
+ * Returns the remote address associated to this call as a string.
+ * The result string must be freed by user using ms_free().
+**/
+LINPHONE_PUBLIC char *linphone_call_get_remote_address_as_string (const LinphoneCall *call);
+
+/**
+ * Returns the diversion address associated to this call
+**/
+LINPHONE_PUBLIC const LinphoneAddress * linphone_call_get_diversion_address (const LinphoneCall *call);
+
+/**
+ * Returns direction of the call (incoming or outgoing).
+**/
+LINPHONE_PUBLIC LinphoneCallDir linphone_call_get_dir (const LinphoneCall *call);
+
+/**
+ * Gets the call log associated to this call.
+ * @param[in] call #LinphoneCall object
+ * @return The #LinphoneCallLog associated with the specified #LinphoneCall
+**/
+LINPHONE_PUBLIC LinphoneCallLog *linphone_call_get_call_log (const LinphoneCall *call);
+
+/**
+ * Gets the refer-to uri (if the call was transfered).
+ * @param[in] call #LinphoneCall object
+ * @return The refer-to uri of the call (if it was transfered)
+**/
+LINPHONE_PUBLIC const char *linphone_call_get_refer_to (const LinphoneCall *call);
+
+/**
+ * Returns true if this calls has received a transfer that has not been
+ * executed yet.
+ * Pending transfers are executed when this call is being paused or closed,
+ * locally or by remote endpoint.
+ * If the call is already paused while receiving the transfer request, the
+ * transfer immediately occurs.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_has_transfer_pending (const LinphoneCall *call);
+
+/**
+ * Gets the transferer if this call was started automatically as a result of an incoming transfer request.
+ * The call in which the transfer request was received is returned in this case.
+ * @param[in] call #LinphoneCall object
+ * @return The transferer call if the specified call was started automatically as a result of an incoming transfer request, NULL otherwise
+**/
+LINPHONE_PUBLIC LinphoneCall *linphone_call_get_transferer_call (const LinphoneCall *call);
+
+/**
+ * When this call has received a transfer request, returns the new call that was automatically created as a result of the transfer.
+**/
+LINPHONE_PUBLIC LinphoneCall *linphone_call_get_transfer_target_call (const LinphoneCall *call);
+
+/**
+ * Returns the call object this call is replacing, if any.
+ * Call replacement can occur during call transfers.
+ * By default, the core automatically terminates the replaced call and accept the new one.
+ * This function allows the application to know whether a new incoming call is a one that replaces another one.
+**/
+LINPHONE_PUBLIC LinphoneCall *linphone_call_get_replaced_call (LinphoneCall *call);
+
+/**
+ * Returns call's duration in seconds.
+**/
+LINPHONE_PUBLIC int linphone_call_get_duration (const LinphoneCall *call);
+
+/**
+ * Returns current parameters associated to the call.
+**/
+LINPHONE_PUBLIC const LinphoneCallParams *linphone_call_get_current_params (LinphoneCall *call);
+
+/**
+ * Returns call parameters proposed by remote.
+ *
+ * This is useful when receiving an incoming call, to know whether the remote party
+ * supports video, encryption or whatever.
+**/
+LINPHONE_PUBLIC const LinphoneCallParams *linphone_call_get_remote_params (LinphoneCall *call);
+
+/**
+ * Indicate whether camera input should be sent to remote end.
+**/
+LINPHONE_PUBLIC void linphone_call_enable_camera (LinphoneCall *lc, bool_t enabled);
+
+/**
+ * Returns TRUE if camera pictures are allowed to be sent to the remote party.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_camera_enabled (const LinphoneCall *lc);
+
+/**
+ * Take a photo of currently received video and write it into a jpeg file.
+ * Note that the snapshot is asynchronous, an application shall not assume that the file is created when the function returns.
+ * @param call a #LinphoneCall
+ * @param file a path where to write the jpeg content.
+ * @return 0 if successfull, -1 otherwise (typically if jpeg format is not supported).
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_take_video_snapshot (LinphoneCall *call, const char *file);
+
+/**
+ * Take a photo of currently captured video and write it into a jpeg file.
+ * Note that the snapshot is asynchronous, an application shall not assume that the file is created when the function returns.
+ * @param call a #LinphoneCall
+ * @param file a path where to write the jpeg content.
+ * @return 0 if successfull, -1 otherwise (typically if jpeg format is not supported).
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_take_preview_snapshot (LinphoneCall *call, const char *file);
+
+/**
+ * Returns the reason for a call termination (either error or normal termination)
+**/
+LINPHONE_PUBLIC LinphoneReason linphone_call_get_reason (const LinphoneCall *call);
+
+/**
+ * Returns full details about call errors or termination reasons.
+ * @param  call #LinphoneCall object on which we want the information error
+ * @return      #LinphoneErrorInfo object holding the reason error.
+ */
+LINPHONE_PUBLIC const LinphoneErrorInfo *linphone_call_get_error_info (const LinphoneCall *call);
+
+/**
+ * Returns the far end's user agent description string, if available.
+**/
+LINPHONE_PUBLIC const char *linphone_call_get_remote_user_agent (LinphoneCall *call);
+
+/**
+ * Returns the far end's sip contact as a string, if available.
+**/
+LINPHONE_PUBLIC const char *linphone_call_get_remote_contact (LinphoneCall *call);
+
+/**
+ * Returns the ZRTP authentication token to verify.
+ * @param call the #LinphoneCall
+ * @return the authentication token to verify.
+**/
+LINPHONE_PUBLIC const char *linphone_call_get_authentication_token (LinphoneCall *call);
+
+/**
+ * Returns whether ZRTP authentication token is verified.
+ * If not, it must be verified by users as described in ZRTP procedure.
+ * Once done, the application must inform of the results with linphone_call_set_authentication_token_verified().
+ * @param call the #LinphoneCall
+ * @return TRUE if authentication token is verifed, false otherwise.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_get_authentication_token_verified (const LinphoneCall *call);
+
+/**
+ * Set the result of ZRTP short code verification by user.
+ * If remote party also does the same, it will update the ZRTP cache so that user's verification will not be required for the two users.
+ * @param call the #LinphoneCall
+ * @param verified whether the ZRTP SAS is verified.
+**/
+LINPHONE_PUBLIC void linphone_call_set_authentication_token_verified (LinphoneCall *call, bool_t verified);
+
+/**
+ * Request remote side to send us a Video Fast Update.
+**/
+LINPHONE_PUBLIC void linphone_call_send_vfu_request (LinphoneCall *call);
+
+/**
+ * Request the callback passed to linphone_call_cbs_set_next_video_frame_decoded() to be called the next time the video decoder properly decodes a video frame.
+ * @param call the #LinphoneCall
+**/
+LINPHONE_PUBLIC void linphone_call_request_notify_next_video_frame_decoded(LinphoneCall *call);
+
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_call_set_next_video_frame_decoded_callback (LinphoneCall *call, LinphoneCallCbFunc cb, void *ud);
+
+/**
+ * Returns the current transfer state, if a transfer has been initiated from this call.
+ * @see linphone_core_transfer_call() , linphone_core_transfer_call_to_another()
+**/
+LINPHONE_PUBLIC LinphoneCallState linphone_call_get_transfer_state (LinphoneCall *call);
+
+/**
+ * Perform a zoom of the video displayed during a call.
+ * @param call the call.
+ * @param zoom_factor a floating point number describing the zoom factor. A value 1.0 corresponds to no zoom applied.
+ * @param cx a floating point number pointing the horizontal center of the zoom to be applied. This value should be between 0.0 and 1.0.
+ * @param cy a floating point number pointing the vertical center of the zoom to be applied. This value should be between 0.0 and 1.0.
+ * @deprecated use linphone_call_zoom instead
+ * cx and cy are updated in return in case their coordinates were too excentrated for the requested zoom factor. The zoom ensures that all the screen is fullfilled with the video.
+**/
+LINPHONE_PUBLIC void linphone_call_zoom_video (LinphoneCall *call, float zoom_factor, float *cx, float *cy);
+
+/**
+ * Perform a zoom of the video displayed during a call.
+ * The zoom ensures that all the screen is fullfilled with the video.
+ * @param call the call.
+ * @param zoom_factor a floating point number describing the zoom factor. A value 1.0 corresponds to no zoom applied.
+ * @param cx a floating point number pointing the horizontal center of the zoom to be applied. This value should be between 0.0 and 1.0.
+ * @param cy a floating point number pointing the vertical center of the zoom to be applied. This value should be between 0.0 and 1.0.
+**/
+LINPHONE_PUBLIC void linphone_call_zoom (LinphoneCall *call, float zoom_factor, float cx, float cy);
+
+/**
+ * Send the specified dtmf.
+ *
+ * The dtmf is automatically played to the user.
+ * @param call The #LinphoneCall object
+ * @param dtmf The dtmf name specified as a char, such as '0', '#' etc...
+ * @return 0 if successful, -1 on error.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_send_dtmf (LinphoneCall *call, char dtmf);
+
+/**
+ * Send a list of dtmf.
+ *
+ * The dtmfs are automatically sent to remote, separated by some needed customizable delay.
+ * Sending is canceled if the call state changes to something not LinphoneCallStreamsRunning.
+ * @param call The #LinphoneCall object
+ * @param dtmfs A dtmf sequence such as '123#123123'
+ * @return -2 if there is already a DTMF sequence, -1 if call is not ready, 0 otherwise.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_send_dtmfs (LinphoneCall *call, const char *dtmfs);
+
+/**
+ * Stop current DTMF sequence sending.
+ *
+ * Please note that some DTMF could be already sent,
+ * depending on when this function call is delayed from #linphone_call_send_dtmfs. This
+ * function will be automatically called if call state change to anything but LinphoneCallStreamsRunning.
+ * @param call The #LinphoneCall object
+**/
+LINPHONE_PUBLIC void linphone_call_cancel_dtmfs (LinphoneCall *call);
+
+/**
+ * Return TRUE if this call is currently part of a conference
+ * @param call #LinphoneCall
+ * @return TRUE if part of a conference.
+ * @deprecated Use linphone_call_get_conference() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_call_is_in_conference (const LinphoneCall *call);
+
+/**
+ * Return the associated conference object
+ * @param call #LinphoneCall
+ * @return A pointer on #LinphoneConference or NULL if the call is not part of any conference.
+ */
+LINPHONE_PUBLIC LinphoneConference *linphone_call_get_conference (const LinphoneCall *call);
+
+/**
+ * Change the playback output device (currently only used for blackberry)
+ * @param call
+ * @param route the wanted audio route (earpiece, speaker, ...)
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_call_set_audio_route (LinphoneCall *call, LinphoneAudioRoute route);
+
+/**
+ * Returns the number of stream for the given call.
+ * Currently there is only two (Audio, Video), but later there will be more.
+ * @param call
+ * @return 2
+**/
+LINPHONE_PUBLIC int linphone_call_get_stream_count (const LinphoneCall *call);
+
+/**
+ * @brief Returns the type of stream for the given stream index.
+ * @return the type (MSAudio, MSVideo, MSText) of the stream of given index.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC MSFormatType linphone_call_get_stream_type (const LinphoneCall *call, int stream_index);
+
+/**
+ * @brief Returns the meta rtp transport for the given stream index.
+ * @return a pointer to the meta rtp transport if it exists, NULL otherwise.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC RtpTransport *linphone_call_get_meta_rtp_transport (const LinphoneCall *call, int stream_index);
+
+/**
+ * @brief Returns the meta rtcp transport for the given stream index.
+ * @return a pointer to the meta rtcp transport if it exists, NULL otherwise.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC RtpTransport *linphone_call_get_meta_rtcp_transport (const LinphoneCall *call, int stream_index);
+
+/**
+ * Pauses the call. If a music file has been setup using linphone_core_set_play_file(),
+ * this file will be played to the remote user.
+ * The only way to resume a paused call is to call linphone_call_resume().
+ * @param[in] call #LinphoneCall object
+ * @return 0 on success, -1 on failure
+ * @see linphone_call_resume()
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_pause (LinphoneCall *call);
+
+/**
+ * Resumes a call.
+ * The call needs to have been paused previously with linphone_call_pause().
+ * @param[in] call #LinphoneCall object
+ * @return 0 on success, -1 on failure
+ * @see linphone_call_pause()
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_resume (LinphoneCall *call);
+
+/**
+ * Terminates a call.
+ * @param[in] call #LinphoneCall object
+ * @return 0 on success, -1 on failure
+**/LINPHONE_PUBLIC LinphoneStatus linphone_call_terminate (LinphoneCall *call);
+
+/**
+ * Terminates a call.
+ * @param[in] call 	#LinphoneCall object
+ * @param[in] ei 	#LinphoneErrorInfo
+ * @return 0 on success, -1 on failure
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_terminate_with_error_info (LinphoneCall *call, const LinphoneErrorInfo *ei);
+
+/**
+ * Redirect the specified call to the given redirect URI.
+ * @param[in] call A #LinphoneCall object
+ * @param[in] redirect_uri The URI to redirect the call to
+ * @return 0 if successful, -1 on error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_call_redirect (LinphoneCall *call, const char *redirect_uri);
+
+/**
+ * Decline a pending incoming call, with a reason.
+ * @param[in] call A #LinphoneCall object that must be in the IncomingReceived state
+ * @param[in] reason The reason for rejecting the call: #LinphoneReasonDeclined or #LinphoneReasonBusy
+ * @return 0 on success, -1 on failure
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_decline (LinphoneCall *call, LinphoneReason reason);
+
+/**
+ * Decline a pending incoming call, with a #LinphoneErrorInfo object.
+ * @param[in] call A #LinphoneCall object that must be in the IncomingReceived state
+ * @param[in] ei #LinphoneErrorInfo containing more information on the call rejection.
+ * @return 0 on success, -1 on failure
+ */
+LINPHONE_PUBLIC int linphone_call_decline_with_error_info (LinphoneCall *call, const LinphoneErrorInfo *ei);
+
+/**
+ * Accept an incoming call.
+ *
+ * Basically the application is notified of incoming calls within the
+ * call_state_changed callback of the #LinphoneCoreVTable structure, where it will receive
+ * a #LinphoneCallIncoming event with the associated #LinphoneCall object.
+ * The application can later accept the call using this method.
+ * @param[in] call A #LinphoneCall object
+ * @return 0 on success, -1 on failure
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_accept (LinphoneCall *call);
+
+/**
+ * Accept an incoming call, with parameters.
+ *
+ * Basically the application is notified of incoming calls within the
+ * call_state_changed callback of the #LinphoneCoreVTable structure, where it will receive
+ * a #LinphoneCallIncoming event with the associated #LinphoneCall object.
+ * The application can later accept the call using this method.
+ * @param[in] call A #LinphoneCall object
+ * @param[in] params The specific parameters for this call, for example whether video is accepted or not. Use NULL to use default parameters
+ * @return 0 on success, -1 on failure
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_accept_with_params (LinphoneCall *call, const LinphoneCallParams *params);
+
+/**
+ * Accept an early media session for an incoming call.
+ * This is identical as calling linphone_call_accept_early_media_with_params() with NULL parameters.
+ * @param[in] call A #LinphoneCall object
+ * @return 0 if successful, -1 otherwise
+ * @see linphone_call_accept_early_media_with_params()
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_accept_early_media (LinphoneCall *call);
+
+/**
+ * When receiving an incoming, accept to start a media session as early-media.
+ * This means the call is not accepted but audio & video streams can be established if the remote party supports early media.
+ * However, unlike after call acceptance, mic and camera input are not sent during early-media, though received audio & video are played normally.
+ * The call can then later be fully accepted using linphone_call_accept() or linphone_call_accept_with_params().
+ * @param[in] call A #LinphoneCall object
+ * @param[in] params The call parameters to use (can be NULL)
+ * @return 0 if successful, -1 otherwise
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_accept_early_media_with_params (LinphoneCall *call, const LinphoneCallParams *params);
+
+/**
+ * Updates a running call according to supplied call parameters or parameters changed in the LinphoneCore.
+ *  It triggers a SIP reINVITE in order to perform a new offer/answer of media capabilities.
+ * Changing the size of the transmitted video after calling #linphone_core_set_preferred_video_size() can be used by passing NULL as params argument.
+ * In case no changes are requested through the #LinphoneCallParams argument, then this argument can be omitted and set to NULL.
+ * WARNING: Updating a call in the #LinphoneCallPaused state will still result in a paused call even if the media directions set in the
+ * params are sendrecv. To resume a paused call, you need to call linphone_call_resume().
+ *
+ * @param[in] call A #LinphoneCall object
+ * @param[in] params The new call parameters to use (may be NULL)
+ * @return 0 if successful, -1 otherwise.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_update (LinphoneCall *call, const LinphoneCallParams *params);
+
+/**
+ * When receiving a #LinphoneCallUpdatedByRemote state notification, prevent #LinphoneCore from performing an automatic answer.
+ *
+ * When receiving a #LinphoneCallUpdatedByRemote state notification (ie an incoming reINVITE), the default behaviour of
+ * #LinphoneCore is defined by the "defer_update_default" option of the "sip" section of the config. If this option is 0 (the default)
+ * then the #LinphoneCore automatically answers the reINIVTE with call parameters unchanged.
+ * However when for example when the remote party updated the call to propose a video stream, it can be useful
+ * to prompt the user before answering. This can be achieved by calling linphone_core_defer_call_update() during
+ * the call state notification, to deactivate the automatic answer that would just confirm the audio but reject the video.
+ * Then, when the user responds to dialog prompt, it becomes possible to call linphone_call_accept_update() to answer
+ * the reINVITE, with eventually video enabled in the #LinphoneCallParams argument.
+ *
+ * The #LinphoneCallUpdatedByRemote notification can also arrive when receiving an INVITE without SDP. In such case, an unchanged offer is made
+ * in the 200Ok, and when the ACK containing the SDP answer is received, #LinphoneCallUpdatedByRemote is triggered to notify the application of possible
+ * changes in the media session. However in such case defering the update has no meaning since we just generating an offer.
+ *
+ * @param[in] call A #LinphoneCall object
+ * @return 0 if successful, -1 if the linphone_call_defer_update() was done outside a valid #LinphoneCallUpdatedByRemote notification
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_defer_update (LinphoneCall *call);
+
+/**
+ * Accept call modifications initiated by other end.
+ *
+ * This call may be performed in response to a #LinphoneCallUpdatedByRemote state notification.
+ * When such notification arrives, the application can decide to call linphone_call_defer_update() so that it can
+ * have the time to prompt the user. linphone_call_get_remote_params() can be used to get information about the call parameters
+ * requested by the other party, such as whether a video stream is requested.
+ *
+ * When the user accepts or refuse the change, linphone_call_accept_update() can be done to answer to the other party.
+ * If params is NULL, then the same call parameters established before the update request will continue to be used (no change).
+ * If params is not NULL, then the update will be accepted according to the parameters passed.
+ * Typical example is when a user accepts to start video, then params should indicate that video stream should be used
+ * (see linphone_call_params_enable_video()).
+ * @param[in] call A #LinphoneCall object
+ * @param[in] params A #LinphoneCallParams object describing the call parameters to accept
+ * @return 0 if successful, -1 otherwise (actually when this function call is performed outside ot #LinphoneCallUpdatedByRemote state)
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_accept_update (LinphoneCall *call, const LinphoneCallParams *params);
+
+/**
+ * Performs a simple call transfer to the specified destination.
+ * The remote endpoint is expected to issue a new call to the specified destination.
+ * The current call remains active and thus can be later paused or terminated.
+ * It is possible to follow the progress of the transfer provided that transferee sends notification about it.
+ * In this case, the transfer_state_changed callback of the #LinphoneCoreVTable is invoked to notify of the state of the new call at the other party.
+ * The notified states are #LinphoneCallOutgoingInit , #LinphoneCallOutgoingProgress, #LinphoneCallOutgoingRinging and #LinphoneCallConnected.
+ * @param[in] call The call to be transfered
+ * @param[in] refer_to The destination the call is to be refered to
+ * @return 0 on success, -1 on failure
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_transfer (LinphoneCall *call, const char *refer_to);
+
+/**
+ * Transfers a call to destination of another running call. This is used for "attended transfer" scenarios.
+ * The transfered call is supposed to be in paused state, so that it is able to accept the transfer immediately.
+ * The destination call is a call previously established to introduce the transfered person.
+ * This method will send a transfer request to the transfered person. The phone of the transfered is then
+ * expected to automatically call to the destination of the transfer. The receiver of the transfer will then automatically
+ * close the call with us (the 'dest' call).
+ * It is possible to follow the progress of the transfer provided that transferee sends notification about it.
+ * In this case, the transfer_state_changed callback of the #LinphoneCoreVTable is invoked to notify of the state of the new call at the other party.
+ * The notified states are #LinphoneCallOutgoingInit , #LinphoneCallOutgoingProgress, #LinphoneCallOutgoingRinging and #LinphoneCallConnected.
+ * @param[in] call A running call you want to transfer
+ * @param[in] dest A running call whose remote person will receive the transfer
+ * @return 0 on success, -1 on failure
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_transfer_to_another (LinphoneCall *call, LinphoneCall *dest);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup media_parameters
+ * @{
+ */
+
+/**
+ * Get the native window handle of the video window, casted as an unsigned long.
+**/
+LINPHONE_PUBLIC void * linphone_call_get_native_video_window_id(const LinphoneCall *call);
+
+/**
+ * Set the native video window id where the video is to be displayed.
+ * For MacOS, Linux, Windows: if not set or 0 a window will be automatically created, unless the special id -1 is given.
+**/
+LINPHONE_PUBLIC void linphone_call_set_native_video_window_id(LinphoneCall *call, void * id);
+
+/**
+ * Enables or disable echo cancellation for this call
+ * @param call
+ * @param val
+**/
+LINPHONE_PUBLIC void linphone_call_enable_echo_cancellation(LinphoneCall *call, bool_t val) ;
+
+/**
+ * Returns TRUE if echo cancellation is enabled.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_echo_cancellation_enabled(const LinphoneCall *call);
+
+/**
+ * Enables or disable echo limiter for this call
+ * @param call
+ * @param val
+**/
+LINPHONE_PUBLIC void linphone_call_enable_echo_limiter(LinphoneCall *call, bool_t val);
+
+/**
+ * Returns TRUE if echo limiter is enabled.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_echo_limiter_enabled(const LinphoneCall *call);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup call_misc
+ * @{
+ */
+
+/**
+ * Create a new chat room for messaging from a call if not already existing, else return existing one.
+ * No reference is given to the caller: the chat room will be deleted when the call is ended.
+ * @param call #LinphoneCall object
+ * @return #LinphoneChatRoom where messaging can take place.
+ */
+LINPHONE_PUBLIC LinphoneChatRoom * linphone_call_get_chat_room(LinphoneCall *call);
+
+/**
+ * Get the mesured playback volume level (received from remote) in dbm0.
+ * @param call The call.
+ * @return float Volume level in percentage.
+ */
+LINPHONE_PUBLIC float linphone_call_get_play_volume(const LinphoneCall *call);
+
+/**
+ * Get the mesured record volume level (sent to remote) in dbm0.
+ * @param call The call.
+ * @return float Volume level in percentage.
+ */
+LINPHONE_PUBLIC float linphone_call_get_record_volume(const LinphoneCall *call);
+
+/**
+ * Get speaker volume gain.
+ * If the sound backend supports it, the returned gain is equal to the gain set
+ * with the system mixer.
+ * @param call The call.
+ * @return Percentage of the max supported volume gain. Valid values are in [ 0.0 : 1.0 ].
+ * In case of failure, a negative value is returned
+ */
+LINPHONE_PUBLIC float linphone_call_get_speaker_volume_gain(const LinphoneCall *call);
+
+/**
+ * Set speaker volume gain.
+ * If the sound backend supports it, the new gain will synchronized with the system mixer.
+ * @param call The call.
+ * @param volume Percentage of the max supported gain. Valid values are in [ 0.0 : 1.0 ].
+ */
+LINPHONE_PUBLIC void linphone_call_set_speaker_volume_gain(LinphoneCall *call, float volume);
+
+/**
+ * Get microphone volume gain.
+ * If the sound backend supports it, the returned gain is equal to the gain set
+ * with the system mixer.
+ * @param call The #LinphoneCall object.
+ * @return double Percentage of the max supported volume gain. Valid values are in [ 0.0 : 1.0 ].
+ * In case of failure, a negative value is returned
+ */
+LINPHONE_PUBLIC float linphone_call_get_microphone_volume_gain(const LinphoneCall *call);
+
+/**
+ * Set microphone volume gain.
+ * If the sound backend supports it, the new gain will synchronized with the system mixer.
+ * @param call The #LinphoneCall object.
+ * @param volume Percentage of the max supported gain. Valid values are in [ 0.0 : 1.0 ].
+ */
+LINPHONE_PUBLIC void linphone_call_set_microphone_volume_gain(LinphoneCall *call, float volume);
+
+/**
+ * Get speaker muted state.
+ * @param call The #LinphoneCall object.
+ * @return The speaker muted state.
+ **/
+LINPHONE_PUBLIC bool_t linphone_call_get_speaker_muted (const LinphoneCall *call);
+
+/**
+ * Set speaker muted state.
+ * @param call The #LinphoneCall object.
+ * @param muted The speaker muted state.
+ **/
+LINPHONE_PUBLIC void linphone_call_set_speaker_muted (LinphoneCall *call, bool_t muted);
+
+/**
+ * Get microphone muted state.
+ * @param call The #LinphoneCall object.
+ * @return The microphone muted state.
+ **/
+LINPHONE_PUBLIC bool_t linphone_call_get_microphone_muted (const LinphoneCall *call);
+
+/**
+ * Set microphone muted state.
+ * @param call The #LinphoneCall object.
+ * @param muted The microphone muted state.
+ **/
+LINPHONE_PUBLIC void linphone_call_set_microphone_muted (LinphoneCall *call, bool_t muted);
+
+/**
+ * Obtain real-time quality rating of the call
+ *
+ * Based on local RTP statistics and RTCP feedback, a quality rating is computed and updated
+ * during all the duration of the call. This function returns its value at the time of the function call.
+ * It is expected that the rating is updated at least every 5 seconds or so.
+ * The rating is a floating point number comprised between 0 and 5.
+ *
+ * 4-5 = good quality <br>
+ * 3-4 = average quality <br>
+ * 2-3 = poor quality <br>
+ * 1-2 = very poor quality <br>
+ * 0-1 = can't be worse, mostly unusable <br>
+ *
+ * @return The function returns -1 if no quality measurement is available, for example if no
+ * active audio stream exist. Otherwise it returns the quality rating.
+**/
+LINPHONE_PUBLIC float linphone_call_get_current_quality(const LinphoneCall *call);
+
+/**
+ * Returns call quality averaged over all the duration of the call.
+ *
+ * See linphone_call_get_current_quality() for more details about quality measurement.
+**/
+LINPHONE_PUBLIC float linphone_call_get_average_quality(const LinphoneCall *call);
+
+/**
+ * Start call recording.
+ * Video record is only available if this function is called in state StreamRunning.
+ * The output file where audio is recorded must be previously specified with linphone_call_params_set_record_file().
+**/
+LINPHONE_PUBLIC void linphone_call_start_recording(LinphoneCall *call);
+
+/**
+ * Stop call recording.
+**/
+LINPHONE_PUBLIC void linphone_call_stop_recording(LinphoneCall *call);
+
+/**
+ * Returns whether or not the call is currently being recorded
+ * @param call LinphoneCall for which we can to know the recording state
+ * @return true if recording is in progress, false otherwise
+**/
+LINPHONE_PUBLIC bool_t linphone_call_is_recording(LinphoneCall *call);
+
+/**
+ * Get a player associated with the call to play a local file and stream it to the remote peer.
+ * @param[in] call #LinphoneCall object
+ * @return A #LinphonePlayer object
+ */
+LINPHONE_PUBLIC LinphonePlayer * linphone_call_get_player(LinphoneCall *call);
+
+/**
+ * Indicates whether an operation is in progress at the media side.
+ * It can be a bad idea to initiate signaling operations (adding video, pausing the call, removing video, changing video parameters) while
+ * the media is busy in establishing the connection (typically ICE connectivity checks). It can result in failures generating loss of time
+ * in future operations in the call.
+ * Applications are invited to check this function after each call state change to decide whether certain operations are permitted or not.
+ * @param call the call
+ * @return TRUE if media is busy in establishing the connection, FALSE otherwise.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_media_in_progress(const LinphoneCall *call);
+
+/**
+ * Call generic OpenGL render for a given call.
+ * @param call The call.
+ */
+LINPHONE_PUBLIC void linphone_call_ogl_render(const LinphoneCall *call);
+
+/**
+ * Send a #LinphoneInfoMessage through an established call
+ * @param call the call
+ * @param info the info message
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_send_info_message(LinphoneCall *call, const LinphoneInfoMessage *info);
+
+/**
+ * Return a copy of the call statistics for a particular stream type.
+ * @param call the call
+ * @param type the stream type
+**/
+LINPHONE_PUBLIC LinphoneCallStats *linphone_call_get_stats(LinphoneCall *call, LinphoneStreamType type);
+
+LINPHONE_PUBLIC LinphoneCallStats *linphone_call_get_audio_stats(LinphoneCall *call);
+
+LINPHONE_PUBLIC LinphoneCallStats *linphone_call_get_video_stats(LinphoneCall *call);
+
+LINPHONE_PUBLIC LinphoneCallStats *linphone_call_get_text_stats(LinphoneCall *call);
+
+/**
+ * Add a listener in order to be notified of #LinphoneCall events. Once an event is received, registred #LinphoneCallCbs are
+ * invoked sequencially.
+ * @param[in] call #LinphoneCall object to monitor.
+ * @param[in] cbs A #LinphoneCallCbs object holding the callbacks you need. A reference is taken by the #LinphoneCall until you invoke linphone_call_remove_callbacks().
+ */
+LINPHONE_PUBLIC void linphone_call_add_callbacks(LinphoneCall *call, LinphoneCallCbs *cbs);
+
+/**
+ * Remove a listener from a #LinphoneCall
+ * @param[in] call #LinphoneCall object
+ * @param[in] cbs #LinphoneCallCbs object to remove.
+ */
+LINPHONE_PUBLIC void linphone_call_remove_callbacks(LinphoneCall *call, LinphoneCallCbs *cbs);
+
+/**
+ * Gets the current LinphoneCallCbs.
+ * This is meant only to be called from a callback to be able to get the user_data associated with the #LinphoneCallCbs that is calling the callback.
+ * @param[in] call #LinphoneCall object
+ * @return The #LinphoneCallCbs that has called the last callback
+ */
+LINPHONE_PUBLIC LinphoneCallCbs *linphone_call_get_current_callbacks(const LinphoneCall *call);
+
+/**
+ * Set call parameters - advanced and not recommended feature - use with caution.
+ * Local call parameters applicable to an outgoing or incoming shall usually be passed to linphone_core_invite_address_with_params() or
+ * linphone_call_accept_with_params().
+ * However, in some cases it might be desirable from a software design standpoint to modify local parameters outside of the application layer, typically
+ * in the purpose of implementing a custom logic including special headers in INVITE or 200Ok requests, driven by a call_state_changed listener method.
+ * This function accepts to assign a new #LinphoneCallParams only in #LinphoneCallOutgoingInit and #LinphoneCallIncomingReceived states.
+ * @param call the #LinphoneCall object
+**/
+LINPHONE_PUBLIC void linphone_call_set_params(LinphoneCall *call, const LinphoneCallParams *params);
+
+/**
+ * Returns local parameters associated with the call.
+ * This is typically the parameters passed at call initiation to linphone_core_invite_address_with_params() or linphone_call_accept_with_params(), or some default
+ * parameters if no #LinphoneCallParams was explicitely passed during call initiation.
+ * @param call the #LinphoneCall object
+ * @return the call's local parameters.
+ **/
+LINPHONE_PUBLIC const LinphoneCallParams *linphone_call_get_params(LinphoneCall *call);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CALL_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-callbacks.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-callbacks.h"
new file mode 100644
index 0000000..bca0e82
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-callbacks.h"
@@ -0,0 +1,314 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CALLBACKS_H_
+#define _L_C_CALLBACKS_H_
+
+// TODO: Remove me in the future.
+#include "linphone/callbacks.h"
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup call_control
+ * @{
+**/
+
+/**
+ * Callback for being notified of received DTMFs.
+ * @param call #LinphoneCall object that received the dtmf
+ * @param dtmf The ascii code of the dtmf
+ */
+typedef void (*LinphoneCallCbsDtmfReceivedCb)(LinphoneCall *call, int dtmf);
+
+/**
+ * Call encryption changed callback.
+ * @param call #LinphoneCall object whose encryption is changed.
+ * @param on Whether encryption is activated.
+ * @param authentication_token An authentication_token, currently set for ZRTP kind of encryption only.
+ */
+typedef void (*LinphoneCallCbsEncryptionChangedCb)(LinphoneCall *call, bool_t on, const char *authentication_token);
+
+/**
+ * Callback for receiving info messages.
+ * @param call #LinphoneCall whose info message belongs to.
+ * @param msg #LinphoneInfoMessage object.
+ */
+typedef void (*LinphoneCallCbsInfoMessageReceivedCb)(LinphoneCall *call, const LinphoneInfoMessage *msg);
+
+/**
+ * Call state notification callback.
+ * @param call #LinphoneCall whose state is changed.
+ * @param cstate The new state of the call
+ * @param message An informational message about the state.
+ */
+typedef void (*LinphoneCallCbsStateChangedCb)(LinphoneCall *call, LinphoneCallState cstate, const char *message);
+
+/**
+ * Callback for receiving quality statistics for calls.
+ * @param call #LinphoneCall object whose statistics are notified
+ * @param stats #LinphoneCallStats object
+ */
+typedef void (*LinphoneCallCbsStatsUpdatedCb)(LinphoneCall *call, const LinphoneCallStats *stats);
+
+/**
+ * Callback for notifying progresses of transfers.
+ * @param call #LinphoneCall that was transfered
+ * @param cstate The state of the call to transfer target at the far end.
+ */
+typedef void (*LinphoneCallCbsTransferStateChangedCb)(LinphoneCall *call, LinphoneCallState cstate);
+
+/**
+ * Callback for notifying the processing SIP ACK messages.
+ * @param call #LinphoneCall for which an ACK is being received or sent
+ * @param ack the ACK message
+ * @param is_received if TRUE this ACK is an incoming one, otherwise it is an ACK about to be sent.
+ */
+typedef void (*LinphoneCallCbsAckProcessingCb)(LinphoneCall *call, LinphoneHeaders *ack, bool_t is_received);
+
+/**
+ * Callback for notifying a received TMMBR.
+ * @param call LinphoneCall for which the TMMBR has changed
+ * @param stream_index the index of the current stream
+ * @param tmmbr the value of the received TMMBR
+ */
+typedef void (*LinphoneCallCbsTmmbrReceivedCb)(LinphoneCall *call, int stream_index, int tmmbr);
+
+/**
+ * Callback for notifying a snapshot taken.
+ * @param call LinphoneCall for which the snapshot was taken
+ * @param filepath the name of the saved file
+ */
+typedef void (*LinphoneCallCbsSnapshotTakenCb)(LinphoneCall *call, const char *filepath);
+
+ /**
+ * Callback to notify a next video frame has been decoded
+ * @param call LinphoneCall for which the next video frame has been decoded
+ */
+typedef void (*LinphoneCallCbsNextVideoFrameDecodedCb)(LinphoneCall *call);
+
+/**
+ * @}
+**/
+
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+ /**
+ * Call back used to notify message delivery status
+ * @param msg #LinphoneChatMessage object
+ * @param status #LinphoneChatMessageState
+ * @param ud application user data
+ * @deprecated Use #LinphoneChatMessageCbsMsgStateChangedCb instead.
+ * @donotwrap
+ */
+typedef void (*LinphoneChatMessageStateChangedCb)(LinphoneChatMessage* msg, LinphoneChatMessageState state, void* ud);
+
+/**
+ * Call back used to notify message delivery status
+ * @param msg #LinphoneChatMessage object
+ * @param status #LinphoneChatMessageState
+ */
+typedef void (*LinphoneChatMessageCbsMsgStateChangedCb)(LinphoneChatMessage* msg, LinphoneChatMessageState state);
+
+/**
+ * Call back used to notify participant IMDN state
+ * @param msg #LinphoneChatMessage object
+ * @param state #LinphoneParticipantImdnState
+ */
+typedef void (*LinphoneChatMessageCbsParticipantImdnStateChangedCb)(LinphoneChatMessage* msg, const LinphoneParticipantImdnState *state);
+
+/**
+ * File transfer receive callback prototype. This function is called by the core upon an incoming File transfer is started. This function may be call several time for the same file in case of large file.
+ * @param msg #LinphoneChatMessage message from which the body is received.
+ * @param content #LinphoneContent incoming content information
+ * @param buffer #LinphoneBuffer holding the received data. Empty buffer means end of file.
+ */
+typedef void (*LinphoneChatMessageCbsFileTransferRecvCb)(LinphoneChatMessage *msg, const LinphoneContent* content, const LinphoneBuffer *buffer);
+
+/**
+ * File transfer send callback prototype. This function is called by the core when an outgoing file transfer is started. This function is called until size is set to 0.
+ * @param msg #LinphoneChatMessage message from which the body is received.
+ * @param content #LinphoneContent outgoing content
+ * @param offset the offset in the file from where to get the data to be sent
+ * @param size the number of bytes expected by the framework
+ * @return A #LinphoneBuffer object holding the data written by the application. An empty buffer means end of file.
+ */
+typedef LinphoneBuffer * (*LinphoneChatMessageCbsFileTransferSendCb)(LinphoneChatMessage *msg,  const LinphoneContent* content, size_t offset, size_t size);
+
+/**
+ * File transfer progress indication callback prototype.
+ * @param msg #LinphoneChatMessage message from which the body is received.
+ * @param content #LinphoneContent incoming content information
+ * @param offset The number of bytes sent/received since the beginning of the transfer.
+ * @param total The total number of bytes to be sent/received.
+ */
+typedef void (*LinphoneChatMessageCbsFileTransferProgressIndicationCb)(LinphoneChatMessage *msg, const LinphoneContent* content, size_t offset, size_t total);
+
+/**
+ * Is composing notification callback prototype.
+ * @param[in] cr #LinphoneChatRoom involved in the conversation
+ * @param[in] remoteAddr The address that has sent the is-composing notification
+ * @param[in] isComposing A boolean value telling whether the remote is composing or not
+ */
+typedef void (*LinphoneChatRoomCbsIsComposingReceivedCb) (LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing);
+
+/**
+ * Callback used to notify a chat room that a message has been received.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] msg The #LinphoneChatMessage that has been received
+ */
+typedef void (*LinphoneChatRoomCbsMessageReceivedCb) (LinphoneChatRoom *cr, LinphoneChatMessage *msg);
+
+/**
+ * Callback used to notify a chat room that a chat message has been received.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsChatMessageReceivedCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify a chat room that a chat message is being sent.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsChatMessageSentCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify a chat room that a participant has been added.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsParticipantAddedCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify a chat room that a participant has been removed.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsParticipantRemovedCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify a chat room that the admin status of a participant has been changed.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsParticipantAdminStatusChangedCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify a chat room state has changed.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] newState The new state of the chat room
+ */
+typedef void (*LinphoneChatRoomCbsStateChangedCb) (LinphoneChatRoom *cr, LinphoneChatRoomState newState);
+
+/**
+ * Callback used to notify a security event in the chat room.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsSecurityEventCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify that the subject of a chat room has changed.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsSubjectChangedCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify a chat room that a message has been received but we were unable to decrypt it
+ * @param cr #LinphoneChatRoom involved in this conversation
+ * @param msg The #LinphoneChatMessage that has been received
+ */
+typedef void (*LinphoneChatRoomCbsUndecryptableMessageReceivedCb) (LinphoneChatRoom *cr, LinphoneChatMessage *msg);
+
+/**
+ * Callback used to notify a chat room that a participant has been added.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsParticipantDeviceAddedCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify a chat room that a participant has been removed.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsParticipantDeviceRemovedCb) (LinphoneChatRoom *cr, const LinphoneEventLog *event_log);
+
+/**
+ * Callback used to notify a chat room has been joined.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsConferenceJoinedCb) (LinphoneChatRoom *cr, const LinphoneEventLog *eventLog);
+
+/**
+ * Callback used to notify a chat room has been left.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] event_log #LinphoneEventLog The event to be notified
+ */
+typedef void (*LinphoneChatRoomCbsConferenceLeftCb) (LinphoneChatRoom *cr, const LinphoneEventLog *eventLog);
+
+/**
+ * Callback used when a group chat room is created server-side to generate the address of the chat room.
+ * The function linphone_chat_room_set_conference_address() needs to be called by this callback.
+ * @param[in] cr #LinphoneChatRoom object
+ */
+typedef void (*LinphoneChatRoomCbsConferenceAddressGenerationCb) (LinphoneChatRoom *cr);
+
+/**
+ * Callback used when a group chat room server is subscribing to registration state of a participant.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] participantAddr #LinphoneAddress object
+ */
+typedef void (*LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb) (LinphoneChatRoom *cr, const LinphoneAddress *participantAddr);
+
+/**
+ * Callback used when a group chat room server is unsubscribing to registration state of a participant.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] participantAddr #LinphoneAddress object
+ */
+typedef void (*LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb) (LinphoneChatRoom *cr, const LinphoneAddress *participantAddr);
+
+/**
+ * Callback used to tell the core whether or not to store the incoming message in db or not using linphone_chat_message_set_to_be_stored().
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] msg The #LinphoneChatMessage that is being received
+ */
+typedef void (*LinphoneChatRoomCbsShouldChatMessageBeStoredCb) (LinphoneChatRoom *cr, LinphoneChatMessage *msg);
+
+/**
+ * @}
+**/
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CALLBACKS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-message-cbs.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-message-cbs.h"
new file mode 100644
index 0000000..dc8d71b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-message-cbs.h"
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CHAT_MESSAGE_CBS_H_
+#define _L_C_CHAT_MESSAGE_CBS_H_
+
+#include "linphone/api/c-callbacks.h"
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+LinphoneChatMessageCbs *linphone_chat_message_cbs_new (void);
+
+/**
+ * Acquire a reference to the chat room callbacks object.
+ * @param[in] cbs The chat room callbacks object
+ * @return The same chat room callbacks object
+**/
+LINPHONE_PUBLIC LinphoneChatMessageCbs * linphone_chat_message_cbs_ref (LinphoneChatMessageCbs *cbs);
+
+/**
+ * Release reference to the chat room callbacks object.
+ * @param[in] cr The chat room callbacks object
+**/
+LINPHONE_PUBLIC void linphone_chat_message_cbs_unref (LinphoneChatMessageCbs *cbs);
+
+/**
+ * Retrieve the user pointer associated with the chat room callbacks object.
+ * @param[in] cr The chat room callbacks object
+ * @return The user pointer associated with the chat room callbacks object
+**/
+LINPHONE_PUBLIC void * linphone_chat_message_cbs_get_user_data (const LinphoneChatMessageCbs *cbs);
+
+/**
+ * Assign a user pointer to the chat room callbacks object.
+ * @param[in] cr The chat room callbacks object
+ * @param[in] ud The user pointer to associate with the chat room callbacks object
+**/
+LINPHONE_PUBLIC void linphone_chat_message_cbs_set_user_data (LinphoneChatMessageCbs *cbs, void *ud);
+
+/**
+ * Get the message state changed callback.
+ * @param[in] cbs #LinphoneChatMessageCbs object.
+ * @return The current message state changed callback.
+ */
+LINPHONE_PUBLIC LinphoneChatMessageCbsMsgStateChangedCb linphone_chat_message_cbs_get_msg_state_changed (const LinphoneChatMessageCbs *cbs);
+
+/**
+ * Set the message state changed callback.
+ * @param[in] cbs LinphoneChatMessageCbs object.
+ * @param[in] cb The message state changed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_cbs_set_msg_state_changed (LinphoneChatMessageCbs *cbs, LinphoneChatMessageCbsMsgStateChangedCb cb);
+
+/**
+ * Get the file transfer receive callback.
+ * @param[in] cbs LinphoneChatMessageCbs object.
+ * @return The current file transfer receive callback.
+ */
+LINPHONE_PUBLIC LinphoneChatMessageCbsFileTransferRecvCb linphone_chat_message_cbs_get_file_transfer_recv (const LinphoneChatMessageCbs *cbs);
+
+/**
+ * Set the file transfer receive callback.
+ * @param[in] cbs LinphoneChatMessageCbs object.
+ * @param[in] cb The file transfer receive callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_cbs_set_file_transfer_recv (LinphoneChatMessageCbs *cbs, LinphoneChatMessageCbsFileTransferRecvCb cb);
+
+/**
+  * Get the file transfer send callback.
+  * @param[in] cbs LinphoneChatMessageCbs object.
+  * @return The current file transfer send callback.
+  */
+LINPHONE_PUBLIC LinphoneChatMessageCbsFileTransferSendCb linphone_chat_message_cbs_get_file_transfer_send (const LinphoneChatMessageCbs *cbs);
+
+/**
+ * Set the file transfer send callback.
+ * @param[in] cbs LinphoneChatMessageCbs object.
+ * @param[in] cb The file transfer send callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_cbs_set_file_transfer_send (LinphoneChatMessageCbs *cbs, LinphoneChatMessageCbsFileTransferSendCb cb);
+
+/**
+ * Get the file transfer progress indication callback.
+ * @param[in] cbs LinphoneChatMessageCbs object.
+ * @return The current file transfer progress indication callback.
+ */
+LINPHONE_PUBLIC LinphoneChatMessageCbsFileTransferProgressIndicationCb linphone_chat_message_cbs_get_file_transfer_progress_indication (const LinphoneChatMessageCbs *cbs);
+
+/**
+ * Set the file transfer progress indication callback.
+ * @param[in] cbs LinphoneChatMessageCbs object.
+ * @param[in] cb The file transfer progress indication callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_cbs_set_file_transfer_progress_indication (LinphoneChatMessageCbs *cbs, LinphoneChatMessageCbsFileTransferProgressIndicationCb cb);
+
+/**
+ * Get the participant IMDN state changed callback.
+ * @param[in] cbs #LinphoneChatMessageCbs object.
+ * @return The current participant IMDN state changed callback.
+ */
+LINPHONE_PUBLIC LinphoneChatMessageCbsParticipantImdnStateChangedCb linphone_chat_message_cbs_get_participant_imdn_state_changed (const LinphoneChatMessageCbs *cbs);
+
+/**
+ * Set the participant IMDN state changed callback.
+ * @param[in] cbs LinphoneChatMessageCbs object.
+ * @param[in] cb The participant IMDN state changed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_cbs_set_participant_imdn_state_changed (LinphoneChatMessageCbs *cbs, LinphoneChatMessageCbsParticipantImdnStateChangedCb cb);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CHAT_MESSAGE_CBS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-message.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-message.h"
new file mode 100644
index 0000000..1e1367c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-message.h"
@@ -0,0 +1,472 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CHAT_MESSAGE_H_
+#define _L_C_CHAT_MESSAGE_H_
+
+#include "linphone/api/c-chat-message-cbs.h"
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+typedef enum _LinphoneChatMessageDir{
+	LinphoneChatMessageIncoming,
+	LinphoneChatMessageOutgoing
+} LinphoneChatMessageDir;
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup chatmessage
+ * @{
+ */
+
+/**
+ * Acquire a reference to the chat message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return The same chat message.
+ */
+LINPHONE_PUBLIC LinphoneChatMessage *linphone_chat_message_ref (LinphoneChatMessage *msg);
+
+/**
+ * Release reference to the chat message.
+ * @param[in] msg #LinphoneChatMessage object.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_unref (LinphoneChatMessage *msg);
+
+/**
+ * Retrieve the user pointer associated with the chat message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return The user pointer associated with the chat message.
+ */
+LINPHONE_PUBLIC void *linphone_chat_message_get_user_data (const LinphoneChatMessage *msg);
+
+/**
+ * Assign a user pointer to the chat message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] ud The user pointer to associate with the chat message.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_set_user_data (LinphoneChatMessage *msg, void *ud);
+
+// =============================================================================
+
+/**
+ * Returns back pointer to #LinphoneCore object.
+**/
+LINPHONE_PUBLIC LinphoneCore *linphone_chat_message_get_core (const LinphoneChatMessage *msg);
+
+LINPHONE_PUBLIC const char *linphone_chat_message_get_external_body_url (const LinphoneChatMessage *msg);
+
+LINPHONE_PUBLIC void linphone_chat_message_set_external_body_url (LinphoneChatMessage *msg, const char *external_body_url);
+
+/**
+ * Get the time the message was sent.
+ * @param[in] msg #LinphoneChatMessage object.
+ */
+LINPHONE_PUBLIC time_t linphone_chat_message_get_time (const LinphoneChatMessage *msg);
+
+/**
+ * Returns TRUE if the message has been sent, returns FALSE if the message has been received.
+ * @param[in] msg #LinphoneChatMessage object.
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_is_outgoing (const LinphoneChatMessage *msg);
+
+/**
+ * Get origin of the message
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return #LinphoneAddress
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_chat_message_get_from_address (const LinphoneChatMessage *msg);
+
+/**
+ * Get destination of the message
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return #LinphoneAddress
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_chat_message_get_to_address (const LinphoneChatMessage *msg);
+
+/**
+ * Get the content type of a chat message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return The content type of the chat message
+ */
+LINPHONE_PUBLIC const char *linphone_chat_message_get_content_type (const LinphoneChatMessage *msg);
+
+/**
+ * Set the content type of a chat message.
+ * This content type must match a content that is text representable, such as text/plain, text/html or image/svg+xml.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] content_type The new content type of the chat message
+ */
+LINPHONE_PUBLIC void linphone_chat_message_set_content_type (LinphoneChatMessage *msg, const char *content_type);
+
+/**
+ * Get text part of this message
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return text or NULL if no text.
+ * @deprecated use getTextContent() instead
+ */
+LINPHONE_PUBLIC const char *linphone_chat_message_get_text (const LinphoneChatMessage* msg);
+
+/**
+ * Get the message identifier.
+ * It is used to identify a message so that it can be notified as delivered and/or displayed.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return The message identifier.
+ */
+LINPHONE_PUBLIC const char *linphone_chat_message_get_message_id (const LinphoneChatMessage *msg);
+
+/**
+ * Linphone message has an app-specific field that can store a text. The application might want
+ * to use it for keeping data over restarts, like thumbnail image path.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return the application-specific data or NULL if none has been stored.
+ */
+LINPHONE_PUBLIC const char *linphone_chat_message_get_appdata (const LinphoneChatMessage *msg);
+
+/**
+ * Linphone message has an app-specific field that can store a text. The application might want
+ * to use it for keeping data over restarts, like thumbnail image path.
+ *
+ * Invoking this function will attempt to update the message storage to reflect the changeif it is
+ * enabled.
+ *
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param data the data to store into the message
+ */
+LINPHONE_PUBLIC void linphone_chat_message_set_appdata (LinphoneChatMessage *msg, const char *data);
+
+/**
+ * Returns the chatroom this message belongs to.
+ * @param[in] msg #LinphoneChatMessage object.
+ */
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_chat_message_get_chat_room (const LinphoneChatMessage *msg);
+
+/**
+ * Get the path to the file to read from or write to during the file transfer.
+ * @param[in] msg #LinphoneChatMessage object
+ * @return The path to the file to use for the file transfer.
+ * @deprecated use linphone_content_get_file_path() instead.
+ */
+LINPHONE_PUBLIC const char *linphone_chat_message_get_file_transfer_filepath (const LinphoneChatMessage *msg);
+
+// =============================================================================
+
+/**
+ * Get if a chat message is to be stored.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return Whether or not the message is to be stored
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_get_to_be_stored (const LinphoneChatMessage *msg);
+
+/**
+ * Set if a chat message is to be stored.
+ * This content type must match a content that is text representable, such as text/plain, text/html or image/svg+xml.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] to_be_stored Whether or not the chat message is to be stored
+ */
+LINPHONE_PUBLIC void linphone_chat_message_set_to_be_stored (LinphoneChatMessage *msg, bool_t to_be_stored);
+
+LINPHONE_PUBLIC unsigned int linphone_chat_message_store (LinphoneChatMessage *msg);
+
+/**
+ * Get the state of the message
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return #LinphoneChatMessageState
+ */
+LINPHONE_PUBLIC LinphoneChatMessageState linphone_chat_message_get_state (const LinphoneChatMessage *msg);
+
+/**
+ * Get if the message was encrypted when transfered
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return whether the message was encrypted when transfered or not
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_is_secured (const LinphoneChatMessage *msg);
+
+/**
+ * Linphone message can carry external body as defined by rfc2017
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return external body url or NULL if not present.
+ */
+LINPHONE_PUBLIC const char *linphone_chat_message_get_external_body_url (const LinphoneChatMessage *msg);
+
+/**
+ * Linphone message can carry external body as defined by rfc2017
+ *
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param url ex: access-type=URL; URL="http://www.foo.com/file"
+ */
+LINPHONE_PUBLIC void linphone_chat_message_set_external_body_url (LinphoneChatMessage *msg,const char *url);
+
+/**
+ * Get the file_transfer_information (used by call backs to recover informations during a rcs file transfer)
+ *
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return a pointer to the #LinphoneContent structure or NULL if not present.
+ */
+LINPHONE_PUBLIC LinphoneContent *linphone_chat_message_get_file_transfer_information (const LinphoneChatMessage *msg);
+
+/**
+ * Return whether or not a chat message is a file transfer.
+ * @param[in] msg #LinphoneChatMessage object
+ * @return Whether or not the message is a file transfer
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_is_file_transfer (const LinphoneChatMessage *msg);
+
+/**
+ * Return whether or not a chat message is a text.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return Whether or not the message is a text
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_is_text (const LinphoneChatMessage *msg);
+
+/**
+ * Start the download of the file from remote server
+ *
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param status_cb #LinphoneChatMessageStateChangeCb status callback invoked when file is downloaded or could not be downloaded
+ * @param ud user data
+ * @deprecated Use linphone_chat_message_download_file() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_chat_message_start_file_download (
+	LinphoneChatMessage *msg,
+	LinphoneChatMessageStateChangedCb status_cb,
+	void *ud
+);
+
+/**
+ * Start the download of the file referenced in a #LinphoneChatMessage from remote server.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @deprecated Use linphone_chat_message_download_content() instead
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_download_file (LinphoneChatMessage *msg);
+
+/**
+ * Start the download of the #LinphoneContent referenced in the #LinphoneChatMessage from remote server.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] c_content #LinphoneContent object to download.
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_download_content(LinphoneChatMessage *msg, LinphoneContent *c_content);
+
+/**
+ * Cancel an ongoing file transfer attached to this message.(upload or download)
+ * @param[in] msg #LinphoneChatMessage object.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_cancel_file_transfer (LinphoneChatMessage *msg);
+
+/**
+ * Send a chat message.
+ * @param[in] msg #LinphoneChatMessage object.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_send (LinphoneChatMessage *msg);
+
+/**
+ * Resend a chat message if it is in the 'not delivered' state for whatever reason.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @deprecated Use linphone_chat_message_send instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_chat_message_resend (LinphoneChatMessage *msg);
+
+LINPHONE_PUBLIC const LinphoneAddress *linphone_chat_message_get_peer_address (const LinphoneChatMessage *msg);
+
+/**
+ * Returns the origin address of a message if it was a outgoing message, or the destination address if it was an incoming message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return #LinphoneAddress
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_chat_message_get_local_address (const LinphoneChatMessage *msg);
+
+/**
+ * Add custom headers to the message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param header_name name of the header
+ * @param header_value header value
+ */
+LINPHONE_PUBLIC void linphone_chat_message_add_custom_header (
+	LinphoneChatMessage *msg,
+	const char *header_name,
+	const char *header_value
+);
+
+/**
+ * Retrieve a custom header value given its name.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param header_name header name searched
+ */
+LINPHONE_PUBLIC const char * linphone_chat_message_get_custom_header (const LinphoneChatMessage *msg, const char *header_name);
+
+/**
+ * Removes a custom header from the message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param header_name name of the header to remove
+ */
+LINPHONE_PUBLIC void linphone_chat_message_remove_custom_header (LinphoneChatMessage *msg, const char *header_name);
+
+/**
+ * Returns TRUE if the message has been read, otherwise returns FALSE.
+ * @param[in] msg #LinphoneChatMessage object.
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_is_read (const LinphoneChatMessage *msg);
+
+LINPHONE_PUBLIC LinphoneReason linphone_chat_message_get_reason (const LinphoneChatMessage *msg);
+
+/**
+ * Get full details about delivery error of a chat message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return a #LinphoneErrorInfo describing the details.
+ */
+LINPHONE_PUBLIC const LinphoneErrorInfo *linphone_chat_message_get_error_info (const LinphoneChatMessage *msg);
+
+/**
+ * Set the path to the file to read from or write to during the file transfer.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] filepath The path to the file to use for the file transfer.
+ * @deprecated use linphone_content_set_file_path() instead.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_set_file_transfer_filepath (LinphoneChatMessage *msg, const char *filepath);
+
+/**
+ * Returns true if the chat message is a forward message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return true if it is a forward message, false otherwise
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_is_forward (LinphoneChatMessage *msg);
+		
+/**
+ * Gets the forward info if available as a string
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return the #LinphoneContent buffer if available, null otherwise
+ */
+LINPHONE_PUBLIC const char *linphone_chat_message_get_forward_info (const LinphoneChatMessage *msg);
+
+/**
+ * Fulfill a chat message char by char. Message linked to a Real Time Text Call send char in realtime following RFC 4103/T.140
+ * To commit a message, use #linphone_chat_room_send_message
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] character T.140 char
+ * @returns 0 if succeed.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_chat_message_put_char (LinphoneChatMessage *msg, uint32_t character);
+
+/**
+ * Get the #LinphoneChatMessageCbs object associated with the LinphoneChatMessage.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return The #LinphoneChatMessageCbs object associated with the LinphoneChatMessage.
+ * @deprecated
+ */
+LINPHONE_PUBLIC LinphoneChatMessageCbs *linphone_chat_message_get_callbacks (const LinphoneChatMessage *msg);
+
+/**
+ * Add a listener in order to be notified of #LinphoneChatMessage events.
+ * @param[in] msg #LinphoneChatMessage object to monitor.
+ * @param[in] cbs A #LinphoneChatMessageCbs object holding the callbacks you need.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_add_callbacks(LinphoneChatMessage *msg, LinphoneChatMessageCbs *cbs);
+
+/**
+ * Remove a listener from a #LinphoneChatMessage
+ * @param[in] msg #LinphoneChatMessage object
+ * @param[in] cbs #LinphoneChatMessageCbs object to remove.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_remove_callbacks(LinphoneChatMessage *msg, LinphoneChatMessageCbs *cbs);
+
+/**
+ * Gets the current LinphoneChatMessageCbs.
+ * This is meant only to be called from a callback to be able to get the user_data associated with the #LinphoneChatMessageCbs that is calling the callback.
+ * @param[in] msg #LinphoneChatMessage object
+ * @return The #LinphoneChatMessageCbs that has called the last callback
+ */
+LINPHONE_PUBLIC LinphoneChatMessageCbs *linphone_chat_message_get_current_callbacks(const LinphoneChatMessage *msg);
+
+/**
+ * Adds a file content to the ChatMessage.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] c_content #LinphoneContent object to add.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_add_file_content (LinphoneChatMessage *msg, LinphoneContent *c_content);
+
+/**
+ * Adds a text content to the ChatMessage.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] text The text to add to the message.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_add_text_content (LinphoneChatMessage *msg, const char *text);
+
+/**
+ * Removes a content from the ChatMessage.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] content the #LinphoneContent object to remove.
+ */
+LINPHONE_PUBLIC void linphone_chat_message_remove_content (LinphoneChatMessage *msg, LinphoneContent *content);
+
+/**
+ * Returns the list of contents in the message.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return \bctbx_list{LinphoneContent} the list of #LinphoneContent.
+ */
+LINPHONE_PUBLIC const bctbx_list_t *linphone_chat_message_get_contents(const LinphoneChatMessage *msg);
+
+/**
+ * Returns true if the chat message has a text content
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return true if it has one, false otherwise
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_has_text_content (const LinphoneChatMessage *msg);
+
+/**
+ * Gets the text content if available as a string
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return the #LinphoneContent buffer if available, null otherwise
+ */
+LINPHONE_PUBLIC const char *linphone_chat_message_get_text_content (const LinphoneChatMessage *msg);
+
+/**
+ * Gets whether or not a file is currently being downloaded or uploaded
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return true if download or upload is in progress, false otherwise
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_message_is_file_transfer_in_progress (const LinphoneChatMessage *msg);
+
+/**
+ * Gets the list of participants for which the imdn state has reached the specified state and the time at which they did.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @param[in] state The LinphoneChatMessageState the imdn have reached (only use LinphoneChatMessageStateDelivered,
+ * LinphoneChatMessageStateDeliveredToUser, LinphoneChatMessageStateDisplayed and LinphoneChatMessageStateNotDelivered)
+ * @return \bctbx_list{LinphoneParticipantImdnState} \onTheFlyList
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_chat_message_get_participants_by_imdn_state (
+	const LinphoneChatMessage *msg,
+	LinphoneChatMessageState state
+);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CHAT_MESSAGE_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room-cbs.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room-cbs.h"
new file mode 100644
index 0000000..d9c102e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room-cbs.h"
@@ -0,0 +1,337 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CHAT_ROOM_CBS_H_
+#define _L_C_CHAT_ROOM_CBS_H_
+
+#include "linphone/api/c-callbacks.h"
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+/**
+ * Acquire a reference to the chat room callbacks object.
+ * @param[in] cbs The chat room callbacks object
+ * @return The same chat room callbacks object
+**/
+LINPHONE_PUBLIC LinphoneChatRoomCbs * linphone_chat_room_cbs_ref (LinphoneChatRoomCbs *cbs);
+
+/**
+ * Release reference to the chat room callbacks object.
+ * @param[in] cr The chat room callbacks object
+**/
+LINPHONE_PUBLIC void linphone_chat_room_cbs_unref (LinphoneChatRoomCbs *cbs);
+
+/**
+ * Retrieve the user pointer associated with the chat room callbacks object.
+ * @param[in] cr The chat room callbacks object
+ * @return The user pointer associated with the chat room callbacks object
+**/
+LINPHONE_PUBLIC void * linphone_chat_room_cbs_get_user_data (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Assign a user pointer to the chat room callbacks object.
+ * @param[in] cr The chat room callbacks object
+ * @param[in] ud The user pointer to associate with the chat room callbacks object
+**/
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_user_data (LinphoneChatRoomCbs *cbs, void *ud);
+
+/**
+ * Get the is-composing received callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current is-composing received callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsIsComposingReceivedCb linphone_chat_room_cbs_get_is_composing_received (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the is-composing received callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The is-composing received callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_is_composing_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsIsComposingReceivedCb cb);
+
+/**
+ * Get the message received callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current message received callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsMessageReceivedCb linphone_chat_room_cbs_get_message_received (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the message received callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The message received callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_message_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsMessageReceivedCb cb);
+
+/**
+ * Get the chat message received callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current chat message received callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsChatMessageReceivedCb linphone_chat_room_cbs_get_chat_message_received (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the chat message received callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The chat message received callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_chat_message_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsChatMessageReceivedCb cb);
+
+/**
+ * Get the chat message sent callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current chat message sent callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsChatMessageSentCb linphone_chat_room_cbs_get_chat_message_sent (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the chat message sent callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The chat message sent callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_chat_message_sent (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsChatMessageSentCb cb);
+
+/**
+ * Get the participant added callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current participant added callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantAddedCb linphone_chat_room_cbs_get_participant_added (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the participant added callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The participant added callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_added (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantAddedCb cb);
+
+/**
+ * Get the participant removed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current participant removed callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantRemovedCb linphone_chat_room_cbs_get_participant_removed (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the participant removed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The participant removed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_removed (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantRemovedCb cb);
+
+/**
+ * Get the participant admin status changed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current participant admin status changed callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantAdminStatusChangedCb linphone_chat_room_cbs_get_participant_admin_status_changed (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the participant admin status changed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The participant admin status changed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_admin_status_changed (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantAdminStatusChangedCb cb);
+
+/**
+ * Get the state changed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current state changed callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsStateChangedCb linphone_chat_room_cbs_get_state_changed (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the state changed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The state changed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_state_changed (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsStateChangedCb cb);
+
+/**
+ * Get the security event callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The security event callback to be used.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsSecurityEventCb linphone_chat_room_cbs_get_security_event (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the security event callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The security event callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_security_event (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsSecurityEventCb cb);
+
+/**
+ * Get the subject changed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current subject changed callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsSubjectChangedCb linphone_chat_room_cbs_get_subject_changed (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the subject changed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The subject changed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_subject_changed (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsSubjectChangedCb cb);
+
+/**
+ * Get the undecryptable message received callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current undecryptable message received callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsUndecryptableMessageReceivedCb linphone_chat_room_cbs_get_undecryptable_message_received (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the undecryptable message received callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The undecryptable message received callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_undecryptable_message_received (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsUndecryptableMessageReceivedCb cb);
+
+/**
+ * Get the participant device added callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current participant device added callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantDeviceAddedCb linphone_chat_room_cbs_get_participant_device_added (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the participant device added callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The participant device added callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_device_added (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantDeviceAddedCb cb);
+
+/**
+ * Get the participant device removed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @return The current participant device removed callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantDeviceRemovedCb linphone_chat_room_cbs_get_participant_device_removed (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the participant device removed callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object.
+ * @param[in] cb The participant device removed callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_device_removed (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantDeviceRemovedCb cb);
+
+/**
+ * Get the conference joined callback.
+ * @param[in] cbs LinphoneChatRoomCbs object.
+ * @return The current conference joined callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsConferenceJoinedCb linphone_chat_room_cbs_get_conference_joined (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the conference joined callback.
+ * @param[in] cbs LinphoneChatRoomCbs object.
+ * @param[in] cb The conference joined callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_conference_joined (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsConferenceJoinedCb cb);
+
+/**
+ * Get the conference left callback.
+ * @param[in] cbs LinphoneChatRoomCbs object.
+ * @return The current conference left callback.
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsConferenceLeftCb linphone_chat_room_cbs_get_conference_left (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the conference left callback.
+ * @param[in] cbs LinphoneChatRoomCbs object.
+ * @param[in] cb The conference left callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_conference_left (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsConferenceLeftCb cb);
+
+/**
+ * Get the conference address generation callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object
+ * @return The current conference address generation callback
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsConferenceAddressGenerationCb linphone_chat_room_cbs_get_conference_address_generation (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the conference address generation callback.
+ * @param[in] cbs #LinphoneChatRoomCbs object
+ * @param[in] cb The conference address generation callback to be used
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_conference_address_generation (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsConferenceAddressGenerationCb cb);
+
+/**
+ * Get the participant registration subscription callback.
+ * @param[in] cbs LinphoneChatRoomCbs object
+ * @return The participant registration subscription callback
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb linphone_chat_room_cbs_get_participant_registration_subscription_requested (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the participant registration subscription callback.
+ * @param[in] cbs LinphoneChatRoomCbs object
+ * @param[in] cb The participant registration subscription callback to be used
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_registration_subscription_requested (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb cb);
+
+/**
+ * Get the participant registration unsubscription callback.
+ * @param[in] cbs LinphoneChatRoomCbs object
+ * @return The participant registration unsubscription callback
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb linphone_chat_room_cbs_get_participant_registration_unsubscription_requested (const LinphoneChatRoomCbs *cbs);
+
+/**
+ * Set the participant registration unsubscription callback.
+ * @param[in] cbs LinphoneChatRoomCbs object
+ * @param[in] cb The participant registration unsubscription callback to be used
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_registration_unsubscription_requested (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb cb);
+
+/**
+ * Get the message should be stored callback.
+ * @param[in] cbs LinphoneChatRoomCbs object
+ * @return The message should be stored getting callback
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbsShouldChatMessageBeStoredCb linphone_chat_room_cbs_get_chat_message_should_be_stored( LinphoneChatRoomCbs *cbs);
+/**
+ * Set the message should be stored callback.
+ * @param[in] cbs LinphoneChatRoomCbs object
+ * @param[in] cb The message should be stored callback to be used
+ */
+LINPHONE_PUBLIC void linphone_chat_room_cbs_set_chat_message_should_be_stored( LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsShouldChatMessageBeStoredCb cb);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CHAT_ROOM_CBS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room-params.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room-params.h"
new file mode 100644
index 0000000..46ba091
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room-params.h"
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CHAT_ROOM_PARAMS_H_
+#define _L_C_CHAT_ROOM_PARAMS_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+/**
+ * Returns new chat room parameters.
+ * @return LinphoneChatRoomParams
+**/
+LINPHONE_PUBLIC LinphoneChatRoomParams *linphone_chat_room_params_new(void);
+
+/**
+ * Acquire a reference to the chat room parameters.
+ * @param[in] params The chat room parameters.
+ * @return The same chat room parameters.
+**/
+LINPHONE_PUBLIC LinphoneChatRoomParams *linphone_chat_room_params_ref(LinphoneChatRoomParams *params);
+
+/**
+ * Release reference to the chat room params.
+ * @param[in] params The chat room params.
+**/
+LINPHONE_PUBLIC void linphone_chat_room_params_unref(LinphoneChatRoomParams *params);
+
+/**
+ * @param[in] params The chat room params.
+ * @return TRUE if the given parameters are valid, FALSE otherwise
+ **/
+LINPHONE_PUBLIC bool_t linphone_chat_room_params_is_valid(const LinphoneChatRoomParams *params);
+
+/**
+ * Get the backend implementation of the chat room associated with the given parameters.
+ * @param[in] params The chat room params.
+ * @return LinphoneChatRoomBackend
+**/
+LINPHONE_PUBLIC LinphoneChatRoomBackend linphone_chat_room_params_get_backend(const LinphoneChatRoomParams *params);
+
+/**
+ * Get the encryption implementation of the chat room associated with the given parameters.
+ * @param[in] params The chat room params.
+ * @return LinphoneChatRoomEncryptionBackend
+**/
+LINPHONE_PUBLIC LinphoneChatRoomEncryptionBackend linphone_chat_room_params_get_encryption_backend(const LinphoneChatRoomParams *params);
+
+/**
+ * Get the group chat status of the chat room associated with the given parameters.
+ * @param[in] params The chat room params.
+ * @return TRUE if group chat is enabled, FALSE if one-to-one
+**/
+LINPHONE_PUBLIC bool_t linphone_chat_room_params_group_enabled(const LinphoneChatRoomParams *params);
+
+/**
+ * Get the encryption status of the chat room associated with the given parameters.
+ * @param[in] params The chat room params.
+ * @return TRUE if encryption is enabled, FALSE otherwise
+**/
+LINPHONE_PUBLIC bool_t linphone_chat_room_params_encryption_enabled(const LinphoneChatRoomParams *params);
+
+/**
+ * Get the real time text status of the chat room associated with the given parameters.
+ * @param[in] params The chat room params.
+ * @return TRUE if real time text is enabled, FALSE otherwise
+**/
+LINPHONE_PUBLIC bool_t linphone_chat_room_params_rtt_enabled(const LinphoneChatRoomParams *params);
+
+/**
+ * Set the backend implementation of these chat room parameters.
+ * @param[in] params The chat room params.
+ * @param[in] backend The #LinphoneChatRoomBackend enum value
+**/
+LINPHONE_PUBLIC void linphone_chat_room_params_set_backend(LinphoneChatRoomParams *params, LinphoneChatRoomBackend backend);
+
+/**
+ * Set the encryption backend implementation of these chat room parameters.
+ * @param[in] params The chat room params.
+ * @param[in] backend The #LinphoneChatRoomEncryptionBackend enum value
+**/
+LINPHONE_PUBLIC void linphone_chat_room_params_set_encryption_backend(LinphoneChatRoomParams *params, LinphoneChatRoomEncryptionBackend backend);
+
+/**
+ * Enables or disables group chat for the chat room associated with the given parameters.
+ * @param[in] cr The chat room params.
+ * @param[in] group. TRUE to enable group chat, FALSE to disable (resulting in one-to-one chat room)
+ **/
+LINPHONE_PUBLIC void linphone_chat_room_params_enable_group(LinphoneChatRoomParams *params, bool_t group);
+
+/**
+ * Enables or disables encryption for the chat room associated with the given parameters.
+ * @param[in] params The chat room params.
+ * @param[in] encrypted. TRUE to enable encryption, FALSE to disable.
+**/
+LINPHONE_PUBLIC void linphone_chat_room_params_enable_encryption(LinphoneChatRoomParams *params, bool_t encrypted);
+
+/**
+ * Enables or disables real time text for the chat room associated with the given parameters.
+ * @param[in] params The chat room params.
+ * @param[in] rtt. TRUE to enable real time text, FALSE to disable.
+**/
+LINPHONE_PUBLIC void linphone_chat_room_params_enable_rtt(LinphoneChatRoomParams *params, bool_t rtt);
+
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CHAT_ROOM_PARAMS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room.h"
new file mode 100644
index 0000000..042585a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-chat-room.h"
@@ -0,0 +1,533 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CHAT_ROOM_H_
+#define _L_C_CHAT_ROOM_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+/**
+ * Acquire a reference to the chat room.
+ * @param[in] cr The chat room.
+ * @return The same chat room.
+**/
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_chat_room_ref(LinphoneChatRoom *cr);
+
+/**
+ * Release reference to the chat room.
+ * @param[in] cr The chat room.
+**/
+LINPHONE_PUBLIC void linphone_chat_room_unref(LinphoneChatRoom *cr);
+
+/**
+ * Retrieve the user pointer associated with the chat room.
+ * @param[in] cr The chat room.
+ * @return The user pointer associated with the chat room.
+**/
+LINPHONE_PUBLIC void *linphone_chat_room_get_user_data(const LinphoneChatRoom *cr);
+
+/**
+ * Assign a user pointer to the chat room.
+ * @param[in] cr The chat room.
+ * @param[in] ud The user pointer to associate with the chat room.
+**/
+LINPHONE_PUBLIC void linphone_chat_room_set_user_data(LinphoneChatRoom *cr, void *ud);
+
+/**
+ * Creates an empty message attached to a dedicated chat room.
+ * @param cr the chat room.
+ * @return a new #LinphoneChatMessage
+ */
+LINPHONE_PUBLIC LinphoneChatMessage *linphone_chat_room_create_empty_message (LinphoneChatRoom *cr);
+
+/**
+ * Creates a message attached to a dedicated chat room.
+ * @param cr the chat room.
+ * @param message text message, NULL if absent.
+ * @return a new #LinphoneChatMessage
+ */
+LINPHONE_PUBLIC LinphoneChatMessage* linphone_chat_room_create_message(LinphoneChatRoom *cr,const char* message);
+
+/**
+ * Creates a message attached to a dedicated chat room.
+ * @param cr the chat room.
+ * @param message text message, NULL if absent.
+ * @param external_body_url the URL given in external body or NULL.
+ * @param state the LinphoneChatMessage.State of the message.
+ * @param time the time_t at which the message has been received/sent.
+ * @param is_read TRUE if the message should be flagged as read, FALSE otherwise.
+ * @param is_incoming TRUE if the message has been received, FALSE otherwise.
+ * @return a new #LinphoneChatMessage
+ * @deprecated Use #linphone_chat_room_create_message() instead. Deprecated since 2017-11-14.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LinphoneChatMessage* linphone_chat_room_create_message_2(LinphoneChatRoom *cr, const char* message, const char* external_body_url, LinphoneChatMessageState state, time_t time, bool_t is_read, bool_t is_incoming);
+
+ /**
+ * Creates a message attached to a dedicated chat room with a particular content.
+ * Use #linphone_chat_room_send_message to initiate the transfer
+ * @param cr the chat room.
+ * @param initial_content #LinphoneContent initial content. #LinphoneCoreVTable.file_transfer_send is invoked later to notify file transfer progress and collect next chunk of the message if LinphoneContent.data is NULL.
+ * @return a new #LinphoneChatMessage
+ */
+LINPHONE_PUBLIC LinphoneChatMessage* linphone_chat_room_create_file_transfer_message(LinphoneChatRoom *cr, LinphoneContent* initial_content);
+
+ /**
+ * Creates a forward message attached to a dedicated chat room with a particular message.
+ * @param cr the chat room.
+ * @param msg #LinphoneChatMessage message to be forwarded.
+ * @return a new #LinphoneChatMessage
+ */
+LINPHONE_PUBLIC LinphoneChatMessage *linphone_chat_room_create_forward_message (LinphoneChatRoom *cr, LinphoneChatMessage *msg);
+
+/**
+ * get peer address \link linphone_core_get_chat_room() associated to \endlink this #LinphoneChatRoom
+ * @param cr #LinphoneChatRoom object
+ * @return #LinphoneAddress peer address
+ */
+LINPHONE_PUBLIC const LinphoneAddress* linphone_chat_room_get_peer_address(LinphoneChatRoom *cr);
+
+/**
+ * get local address \link linphone_core_get_chat_room() associated to \endlink this #LinphoneChatRoom
+ * @param cr #LinphoneChatRoom object
+ * @return #LinphoneAddress local address
+ */
+LINPHONE_PUBLIC const LinphoneAddress* linphone_chat_room_get_local_address(LinphoneChatRoom *cr);
+
+
+/**
+ * Send a message to peer member of this chat room.
+ * @deprecated Use linphone_chat_message_send() instead.
+ * @param cr #LinphoneChatRoom object
+ * @param msg message to be sent
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_chat_room_send_message(LinphoneChatRoom *cr, const char *msg);
+
+/**
+ * Send a message to peer member of this chat room.
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] msg #LinphoneChatMessage object
+ * The state of the message sending will be notified via the callbacks defined in the #LinphoneChatMessageCbs object that can be obtained
+ * by calling linphone_chat_message_get_callbacks().
+ * The #LinphoneChatMessage reference is transfered to the function and thus doesn't need to be unref'd by the application.
+ * @deprecated Use linphone_chat_message_send() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_chat_room_send_chat_message(LinphoneChatRoom *cr, LinphoneChatMessage *msg);
+
+/**
+ * Used to receive a chat message when using async mechanism with IM encryption engine
+ * @param[in] cr #LinphoneChatRoom object
+ * @param[in] msg #LinphoneChatMessage object
+ */
+LINPHONE_PUBLIC void linphone_chat_room_receive_chat_message (LinphoneChatRoom *cr, LinphoneChatMessage *msg);
+
+/**
+ * Mark all messages of the conversation as read
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_mark_as_read(LinphoneChatRoom *cr);
+
+/**
+ * Delete a message from the chat room history.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation.
+ * @param[in] msg The #LinphoneChatMessage object to remove.
+ */
+
+LINPHONE_PUBLIC void linphone_chat_room_delete_message(LinphoneChatRoom *cr, LinphoneChatMessage *msg);
+
+/**
+ * Delete all messages from the history
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_delete_history(LinphoneChatRoom *cr);
+
+/**
+ * Gets the number of messages in a chat room.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which size has to be computed
+ * @return the number of messages.
+ */
+LINPHONE_PUBLIC int linphone_chat_room_get_history_size(LinphoneChatRoom *cr);
+
+/**
+ * Returns whether or not a #LinphoneChatRoom has at least one #LinphoneChatMessage or not.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation
+ * @return true if there are no #LinphoneChatMessage, false otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_room_is_empty (LinphoneChatRoom *cr);
+
+/**
+ * Gets nb_message most recent messages from cr chat room, sorted from oldest to most recent.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which messages should be retrieved
+ * @param[in] nb_message Number of message to retrieve. 0 means everything.
+ * @return \bctbx_list{LinphoneChatMessage} \onTheFlyList
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history (LinphoneChatRoom *cr, int nb_message);
+
+/**
+ * Gets the partial list of messages in the given range, sorted from oldest to most recent.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which messages should be retrieved
+ * @param[in] begin The first message of the range to be retrieved. History most recent message has index 0.
+ * @param[in] end The last message of the range to be retrieved. History oldest message has index of history size - 1 (use #linphone_chat_room_get_history_size to retrieve history size)
+ * @return \bctbx_list{LinphoneChatMessage} \onTheFlyList
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_range (LinphoneChatRoom *cr, int begin, int end);
+
+/**
+ * Gets nb_events most recent chat message events from cr chat room, sorted from oldest to most recent.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which events should be retrieved
+ * @param[in] nb_events Number of events to retrieve. 0 means everything.
+ * @return \bctbx_list{LinphoneEventLog} \onTheFlyList
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_message_events (LinphoneChatRoom *cr, int nb_events);
+
+/**
+ * Gets the partial list of chat message events in the given range, sorted from oldest to most recent.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which events should be retrieved
+ * @param[in] begin The first event of the range to be retrieved. History most recent event has index 0.
+ * @param[in] end The last event of the range to be retrieved. History oldest event has index of history size - 1
+ * @return \bctbx_list{LinphoneEventLog} \onTheFlyList
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_range_message_events (LinphoneChatRoom *cr, int begin, int end);
+
+/**
+ * Gets nb_events most recent events from cr chat room, sorted from oldest to most recent.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which events should be retrieved
+ * @param[in] nb_events Number of events to retrieve. 0 means everything.
+ * @return \bctbx_list{LinphoneEventLog} \onTheFlyList
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_events (LinphoneChatRoom *cr, int nb_events);
+
+/**
+ * Gets the partial list of events in the given range, sorted from oldest to most recent.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which events should be retrieved
+ * @param[in] begin The first event of the range to be retrieved. History most recent event has index 0.
+ * @param[in] end The last event of the range to be retrieved. History oldest event has index of history size - 1
+ * @return \bctbx_list{LinphoneEventLog} \onTheFlyList
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_range_events (LinphoneChatRoom *cr, int begin, int end);
+
+/**
+ * Gets the number of events in a chat room.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which size has to be computed
+ * @return the number of events.
+ */
+LINPHONE_PUBLIC int linphone_chat_room_get_history_events_size(LinphoneChatRoom *cr);
+
+/**
+ * Gets the last chat message sent or received in this chat room
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which last message should be retrieved
+ * @return the latest #LinphoneChatMessage
+ */
+LINPHONE_PUBLIC LinphoneChatMessage *linphone_chat_room_get_last_message_in_history(LinphoneChatRoom *cr);
+
+/**
+ * Gets the chat message sent or received in this chat room that matches the message_id
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which the message should be retrieved
+ * @param[in] message_id The id of the message to find
+ * @return the #LinphoneChatMessage
+ */
+LINPHONE_PUBLIC LinphoneChatMessage * linphone_chat_room_find_message(LinphoneChatRoom *cr, const char *message_id);
+
+/**
+ * Notifies the destination of the chat message being composed that the user is typing a new message.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which a new message is being typed.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_compose(LinphoneChatRoom *cr);
+
+/**
+ * Tells whether the remote is currently composing a message.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation.
+ * @return TRUE if the remote is currently composing a message, FALSE otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_room_is_remote_composing(const LinphoneChatRoom *cr);
+
+/**
+ * Gets the number of unread messages in the chatroom.
+ * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation.
+ * @return the number of unread messages.
+ */
+LINPHONE_PUBLIC int linphone_chat_room_get_unread_messages_count(LinphoneChatRoom *cr);
+
+/**
+ * Returns back pointer to #LinphoneCore object.
+**/
+LINPHONE_PUBLIC LinphoneCore* linphone_chat_room_get_core(const LinphoneChatRoom *cr);
+
+/**
+ * When realtime text is enabled #linphone_call_params_realtime_text_enabled, #LinphoneCoreIsComposingReceivedCb is call everytime a char is received from peer.
+ * At the end of remote typing a regular #LinphoneChatMessage is received with committed data from #LinphoneCoreMessageReceivedCb.
+ * @param[in] cr #LinphoneChatRoom object
+ * @returns  RFC 4103/T.140 char
+ */
+LINPHONE_PUBLIC uint32_t linphone_chat_room_get_char(const LinphoneChatRoom *cr);
+
+/**
+ * Returns true if lime is available for given peer
+ *
+ * @return true if zrtp secrets have already been shared and ready to use
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_room_lime_available(LinphoneChatRoom *cr);
+
+/**
+ * get Curent Call associated to this chatroom if any
+ * To commit a message, use #linphone_chat_room_send_message
+ * @param[in] room #LinphoneChatRomm
+ * @returns #LinphoneCall or NULL.
+ */
+LINPHONE_PUBLIC LinphoneCall *linphone_chat_room_get_call(const LinphoneChatRoom *room);
+
+/**
+ * Add a listener in order to be notified of #LinphoneChatRoom events. Once an event is received, registred #LinphoneChatRoomCbs are
+ * invoked sequencially.
+ * @param[in] call #LinphoneChatRoom object to monitor.
+ * @param[in] cbs A #LinphoneChatRoomCbs object holding the callbacks you need. A reference is taken by the #LinphoneChatRoom until you invoke linphone_call_remove_callbacks().
+ */
+LINPHONE_PUBLIC void linphone_chat_room_add_callbacks(LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs);
+
+/**
+ * Remove a listener from a LinphoneChatRoom
+ * @param[in] call LinphoneChatRoom object
+ * @param[in] cbs LinphoneChatRoomCbs object to remove.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_remove_callbacks(LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs);
+
+/**
+ * Gets the current LinphoneChatRoomCbs.
+ * This is meant only to be called from a callback to be able to get the user_data associated with the LinphoneChatRoomCbs that is calling the callback.
+ * @param[in] call LinphoneChatRoom object
+ * @return The LinphoneChatRoomCbs that has called the last callback
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbs *linphone_chat_room_get_current_callbacks(const LinphoneChatRoom *cr);
+
+/**
+ * Get the state of the chat room.
+ * @param[in] cr #LinphoneChatRoom object
+ * @return The state of the chat room
+ */
+LINPHONE_PUBLIC LinphoneChatRoomState linphone_chat_room_get_state (const LinphoneChatRoom *cr);
+
+/**
+ * Return whether or not the chat room has been left.
+ * @param[in] cr #LinphoneChatRoom object
+ * @return whether or not the chat room has been left
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_room_has_been_left (const LinphoneChatRoom *cr);
+
+/**
+ * Return the last updated time for the chat room
+ * @param[in] cr LinphoneChatRoom object
+ * @return the last updated time
+ */
+LINPHONE_PUBLIC time_t linphone_chat_room_get_last_update_time(const LinphoneChatRoom *cr);
+
+/**
+ * Add a participant to a chat room. This may fail if this type of chat room does not handle participants.
+ * Use linphone_chat_room_can_handle_participants() to know if this chat room handles participants.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] addr The address of the participant to add to the chat room
+ */
+LINPHONE_PUBLIC void linphone_chat_room_add_participant (LinphoneChatRoom *cr, const LinphoneAddress *addr);
+
+/**
+ * Add several participants to a chat room at once. This may fail if this type of chat room does not handle participants.
+ * Use linphone_chat_room_can_handle_participants() to know if this chat room handles participants.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] addresses \bctbx_list{LinphoneAddress}
+ */
+LINPHONE_PUBLIC void linphone_chat_room_add_participants (LinphoneChatRoom *cr, const bctbx_list_t *addresses);
+
+/**
+ * Tells whether a chat room is able to handle participants.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return A boolean value telling whether the chat room can handle participants or not
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_room_can_handle_participants (const LinphoneChatRoom *cr);
+
+/**
+ * Find a participant of a chat room from its address.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] addr The address to search in the list of participants of the chat room
+ * @return The participant if found, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphoneParticipant *linphone_chat_room_find_participant (const LinphoneChatRoom *cr, const LinphoneAddress *addr);
+
+/**
+ * Get the capabilities of a chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return The capabilities of the chat room
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCapabilitiesMask linphone_chat_room_get_capabilities (const LinphoneChatRoom *cr);
+
+/**
+ * Check if a chat room has given capabilities.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] mask A Capabilities mask
+ * @return True if the mask matches, false otherwise
+ */
+LINPHONE_PUBLIC bool_t linphone_chat_room_has_capability(const LinphoneChatRoom *cr, int mask);
+
+/**
+ * Get the conference address of the chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return The conference address of the chat room or NULL if this type of chat room is not conference based
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_chat_room_get_conference_address (const LinphoneChatRoom *cr);
+
+/**
+ * Get the participant representing myself in the chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return The participant representing myself in the conference.
+ */
+LINPHONE_PUBLIC LinphoneParticipant *linphone_chat_room_get_me (const LinphoneChatRoom *cr);
+
+/**
+ * Get the number of participants in the chat room (that is without ourselves).
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return The number of participants in the chat room
+ */
+LINPHONE_PUBLIC int linphone_chat_room_get_nb_participants (const LinphoneChatRoom *cr);
+
+/**
+ * Get the list of participants of a chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return \bctbx_list{LinphoneParticipant}
+ */
+LINPHONE_PUBLIC bctbx_list_t * linphone_chat_room_get_participants (const LinphoneChatRoom *cr);
+
+/**
+ * Get the subject of a chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return The subject of the chat room
+ */
+LINPHONE_PUBLIC const char * linphone_chat_room_get_subject (const LinphoneChatRoom *cr);
+
+/**
+ * Get the security level of a chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return The security level of the chat room
+ */
+LINPHONE_PUBLIC LinphoneChatRoomSecurityLevel linphone_chat_room_get_security_level (LinphoneChatRoom *cr);
+
+/**
+ * Leave a chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ */
+LINPHONE_PUBLIC void linphone_chat_room_leave (LinphoneChatRoom *cr);
+
+/**
+ * Remove a participant of a chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] participant The participant to remove from the chat room
+ */
+LINPHONE_PUBLIC void linphone_chat_room_remove_participant (LinphoneChatRoom *cr, LinphoneParticipant *participant);
+
+/**
+ * Remove several participants of a chat room at once.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] participants \bctbx_list{LinphoneParticipant}
+ */
+LINPHONE_PUBLIC void linphone_chat_room_remove_participants (LinphoneChatRoom *cr, const bctbx_list_t *participants);
+
+/**
+ * Change the admin status of a participant of a chat room (you need to be an admin yourself to do this).
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] participant The Participant for which to change the admin status
+ * @param[in] isAdmin A boolean value telling whether the participant should now be an admin or not
+ */
+LINPHONE_PUBLIC void linphone_chat_room_set_participant_admin_status (LinphoneChatRoom *cr, LinphoneParticipant *participant, bool_t isAdmin);
+
+/**
+ * Set the subject of a chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] subject The new subject to set for the chat room
+ */
+LINPHONE_PUBLIC void linphone_chat_room_set_subject (LinphoneChatRoom *cr, const char *subject);
+
+/**
+ * Gets the list of participants that are currently composing
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return \bctbx_list{LinphoneAddress} list of addresses that are in the is_composing state
+ */
+LINPHONE_PUBLIC const bctbx_list_t * linphone_chat_room_get_composing_addresses(LinphoneChatRoom *cr);
+
+/**
+ * Set the conference address of a group chat room. This function needs to be called from the
+ * #LinphoneChatRoomCbsConferenceAddressGenerationCb callback and only there.
+ * This function is meaningful only for server implementation of chatroom, and shall not by used by client applications.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] confAddr The conference address to be used by the group chat room
+ */
+LINPHONE_PUBLIC void linphone_chat_room_set_conference_address (LinphoneChatRoom *cr, const LinphoneAddress *confAddr);
+
+/**
+ * Set the list of participant devices in the form of SIP URIs with GRUUs for a given participant.
+ * This function is meaningful only for server implementation of chatroom, and shall not by used by client applications.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] partAddr The participant address
+ * @param[in] deviceIdentities \bctbx_list{LinphoneParticipantDeviceIdentity} list of the participant devices to be used by the group chat room
+ */
+LINPHONE_PUBLIC void linphone_chat_room_set_participant_devices(LinphoneChatRoom *cr, const LinphoneAddress *partAddr, const bctbx_list_t *deviceIdentities);
+
+
+/**
+ * Notify the chatroom that a participant device has just registered.
+ * This function is meaningful only for server implementation of chatroom, and shall not by used by client applications.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @param[in] partDevice list of the participant devices to be used by the group chat room
+ */
+LINPHONE_PUBLIC void linphone_chat_room_notify_participant_device_registration(LinphoneChatRoom *cr, const LinphoneAddress *participant_device);
+
+/**
+ * Returns back pointer to #LinphoneCore object.
+ * @deprecated use linphone_chat_room_get_core()
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneCore* linphone_chat_room_get_lc(const LinphoneChatRoom *cr);
+
+/**
+ * Returns current parameters associated with the chat room.
+ * This is typically the parameters passed at chat room creation to linphone_core_create_chat_room() or some default
+ * parameters if no #LinphoneChatRoomParams was explicitely passed during chat room creation.
+ * @param cr the #LinphoneChatRoom object
+ * @return the chat room current parameters.
+**/
+LINPHONE_PUBLIC const LinphoneChatRoomParams *linphone_chat_room_get_current_params(const LinphoneChatRoom *cr);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CHAT_ROOM_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-content.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-content.h"
new file mode 100644
index 0000000..a21d053
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-content.h"
@@ -0,0 +1,290 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_CONTENT_H_
+#define _L_C_CONTENT_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Acquire a reference to the content.
+ * @param[in] content #LinphoneContent object.
+ * @return The same #LinphoneContent object.
+**/
+LINPHONE_PUBLIC LinphoneContent *linphone_content_ref (LinphoneContent *content);
+
+/**
+ * Release reference to the content.
+ * @param[in] content #LinphoneContent object.
+**/
+LINPHONE_PUBLIC void linphone_content_unref (LinphoneContent *content);
+
+/**
+ * Retrieve the user pointer associated with the content.
+ * @param[in] content #LinphoneContent object.
+ * @return The user pointer associated with the content.
+**/
+LINPHONE_PUBLIC void *linphone_content_get_user_data (const LinphoneContent *content);
+
+/**
+ * Assign a user pointer to the content.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] ud The user pointer to associate with the content.
+**/
+LINPHONE_PUBLIC void linphone_content_set_user_data (LinphoneContent *content, void *user_data);
+
+/**
+ * Get the mime type of the content data.
+ * @param[in] content #LinphoneContent object.
+ * @return The mime type of the content data, for example "application".
+ */
+LINPHONE_PUBLIC const char *linphone_content_get_type (const LinphoneContent *content);
+
+/**
+ * Set the mime type of the content data.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] type The mime type of the content data, for example "application".
+ */
+LINPHONE_PUBLIC void linphone_content_set_type (LinphoneContent *content, const char *type);
+
+/**
+ * Get the mime subtype of the content data.
+ * @param[in] content #LinphoneContent object.
+ * @return The mime subtype of the content data, for example "html".
+ */
+LINPHONE_PUBLIC const char *linphone_content_get_subtype (const LinphoneContent *content);
+
+/**
+ * Set the mime subtype of the content data.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] subtype The mime subtype of the content data, for example "html".
+ */
+LINPHONE_PUBLIC void linphone_content_set_subtype (LinphoneContent *content, const char *subtype);
+
+/**
+ * Adds a parameter to the ContentType header.
+ * @param[in] content LinphoneContent object.
+ * @param[in] name the name of the parameter to add.
+ * @param[in] value the value of the parameter to add.
+ */
+LINPHONE_PUBLIC void linphone_content_add_content_type_parameter (
+	LinphoneContent *content,
+	const char *name,
+	const char *value
+);
+
+/**
+ * Get the content data buffer, usually a string.
+ * @param[in] content #LinphoneContent object.
+ * @return The content data buffer.
+ */
+LINPHONE_PUBLIC const uint8_t *linphone_content_get_buffer (const LinphoneContent *content);
+
+/**
+ * Set the content data buffer, usually a string.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] buffer The content data buffer.
+ * @param[in] size The size of the content data buffer.
+ */
+LINPHONE_PUBLIC void linphone_content_set_buffer (LinphoneContent *content, const uint8_t *buffer, size_t size);
+
+/**
+ * Get the string content data buffer.
+ * @param[in] content #LinphoneContent object
+ * @return The string content data buffer.
+ */
+LINPHONE_PUBLIC const char *linphone_content_get_string_buffer (const LinphoneContent *content);
+
+/**
+ * Set the string content data buffer.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] buffer The string content data buffer.
+ */
+LINPHONE_PUBLIC void linphone_content_set_string_buffer (LinphoneContent *content, const char *buffer);
+
+/**
+ * Get the content data buffer size, excluding null character despite null character is always set for convenience.
+ * @param[in] content #LinphoneContent object.
+ * @return The content data buffer size.
+ */
+LINPHONE_PUBLIC size_t linphone_content_get_size (const LinphoneContent *content);
+
+/**
+ * Get the file size if content is either a FileContent or a FileTransferContent.
+ * @param[in] content #LinphoneContent object.
+ * @return The represented file size.
+ */
+LINPHONE_PUBLIC size_t linphone_content_get_file_size(const LinphoneContent *content);
+
+/**
+ * Set the content data size, excluding null character despite null character is always set for convenience.
+ * @param[in] content #LinphoneContent object
+ * @param[in] size The content data buffer size.
+ */
+LINPHONE_PUBLIC void linphone_content_set_size (LinphoneContent *content, size_t size);
+
+/**
+ * Get the encoding of the data buffer, for example "gzip".
+ * @param[in] content #LinphoneContent object.
+ * @return The encoding of the data buffer.
+ */
+LINPHONE_PUBLIC const char *linphone_content_get_encoding (const LinphoneContent *content);
+
+/**
+ * Set the encoding of the data buffer, for example "gzip".
+ * @param[in] content #LinphoneContent object.
+ * @param[in] encoding The encoding of the data buffer.
+ */
+LINPHONE_PUBLIC void linphone_content_set_encoding (LinphoneContent *content, const char *encoding);
+
+/**
+ * Get the name associated with a RCS file transfer message. It is used to store the original filename of the file to be downloaded from server.
+ * @param[in] content #LinphoneContent object.
+ * @return The name of the content.
+ */
+LINPHONE_PUBLIC const char *linphone_content_get_name (const LinphoneContent *content);
+
+/**
+ * Set the name associated with a RCS file transfer message. It is used to store the original filename of the file to be downloaded from server.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] name The name of the content.
+ */
+LINPHONE_PUBLIC void linphone_content_set_name (LinphoneContent *content, const char *name);
+
+/**
+ * Tell whether a content is a multipart content.
+ * @param[in] content #LinphoneContent object.
+ * @return A boolean value telling whether the content is multipart or not.
+ */
+LINPHONE_PUBLIC bool_t linphone_content_is_multipart (const LinphoneContent *content);
+
+/**
+ * Get all the parts from a multipart content.
+ * @param[in] content #LinphoneContent object.
+ * @return A \bctbx_list{LinphoneContent} \onTheFlyList object holding the part if found, NULL otherwise.
+ */
+LINPHONE_PUBLIC 
+bctbx_list_t *linphone_content_get_parts (const LinphoneContent *content);
+
+/**
+ * Get a part from a multipart content according to its index.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] idx The index of the part to get.
+ * @return A #LinphoneContent object holding the part if found, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphoneContent *linphone_content_get_part (const LinphoneContent *content, int idx);
+
+/**
+ * Find a part from a multipart content looking for a part header with a specified value.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] header_name The name of the header to look for.
+ * @param[in] header_value The value of the header to look for.
+ * @return A #LinphoneContent object object the part if found, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphoneContent *linphone_content_find_part_by_header (
+	const LinphoneContent *content,
+	const char *header_name,
+	const char *header_value
+);
+
+/**
+ * Get a custom header value of a content.
+ * @param[in] content #LinphoneContent object.
+ * @param[in] header_name The name of the header to get the value from.
+ * @return The value of the header if found, NULL otherwise.
+ */
+LINPHONE_PUBLIC const char *linphone_content_get_custom_header (const LinphoneContent *content, const char *header_name);
+
+/**
+ * Get the key associated with a RCS file transfer message if encrypted
+ * @param[in] content #LinphoneContent object.
+ * @return The key to encrypt/decrypt the file associated to this content.
+ */
+LINPHONE_PUBLIC const char *linphone_content_get_key (const LinphoneContent *content);
+
+/**
+ * Get the size of key associated with a RCS file transfer message if encrypted
+ * @param[in] content #LinphoneContent object.
+ * @return The key size in bytes
+ */
+LINPHONE_PUBLIC size_t linphone_content_get_key_size (const LinphoneContent *content);
+
+/**
+ * Set the key associated with a RCS file transfer message if encrypted
+ * @param[in] content #LinphoneContent object.
+ * @param[in] key The key to be used to encrypt/decrypt file associated to this content.
+ * @param[in] key_length The lengh of the key.
+ */
+LINPHONE_PUBLIC void linphone_content_set_key (LinphoneContent *content, const char *key, const size_t key_length);
+
+/**
+ * Get the file transfer filepath set for this content (replace linphone_chat_message_get_file_transfer_filepath).
+ * @param[in] content #LinphoneContent object.
+ * @return The file path set for this content if it has been set, NULL otherwise.
+ */
+LINPHONE_PUBLIC const char *linphone_content_get_file_path (const LinphoneContent *content);
+
+/**
+ * Set the file transfer filepath for this content (replace linphone_chat_message_set_file_transfer_filepath).
+ * @param[in] content #LinphoneContent object.
+ * @param[in] file_path the file transfer filepath.
+ */
+LINPHONE_PUBLIC void linphone_content_set_file_path (LinphoneContent *content, const char *file_path);
+
+/**
+ * Tells whether or not this content contains text.
+ * @param[in] content #LinphoneContent object.
+ * @return True if this content contains plain text, false otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_content_is_text (const LinphoneContent *content);
+
+/**
+ * Tells whether or not this content contains a file.
+ * @param[in] content #LinphoneContent object.
+ * @return True if this content contains a file, false otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_content_is_file (const LinphoneContent *content);
+
+/**
+ * Tells whether or not this content is a file transfer.
+ * @param[in] content #LinphoneContent object.
+ * @return True if this content is a file transfer, false otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_content_is_file_transfer (const LinphoneContent *content);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_CONTENT_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-dial-plan.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-dial-plan.h"
new file mode 100644
index 0000000..244f3b4
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-dial-plan.h"
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_DIAL_PLAN_H_
+#define _L_C_DIAL_PLAN_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Increases the reference counter of #LinphoneDialPlan objects.
+ */
+LINPHONE_PUBLIC LinphoneDialPlan *linphone_dial_plan_ref(LinphoneDialPlan *dp);
+
+/**
+ * Decreases the reference counter of #LinphoneDialPaln objects.
+ */
+LINPHONE_PUBLIC void linphone_dial_plan_unref(LinphoneDialPlan *dp);
+
+ /**
+  * Returns the country name of the dialplan
+  * @return the country name
+  */
+ LINPHONE_PUBLIC const char * linphone_dial_plan_get_country(const LinphoneDialPlan *dp);
+
+  /**
+  * Returns the iso country code of the dialplan
+  * @return the iso country code
+  */
+ LINPHONE_PUBLIC const char * linphone_dial_plan_get_iso_country_code(const LinphoneDialPlan *dp);
+
+  /**
+  * Returns the country calling code of the dialplan
+  * @return the country calling code
+  */
+ LINPHONE_PUBLIC const char * linphone_dial_plan_get_country_calling_code(const LinphoneDialPlan *dp);
+
+  /**
+  * Returns the national number length of the dialplan
+  * @return the national number length
+  */
+ LINPHONE_PUBLIC int linphone_dial_plan_get_national_number_length(const LinphoneDialPlan *dp);
+
+  /**
+  * Returns the international call prefix of the dialplan
+  * @return the international call prefix
+  */
+ LINPHONE_PUBLIC const char * linphone_dial_plan_get_international_call_prefix(const LinphoneDialPlan *dp);
+
+ /**
+ *Function to get  call country code from  ISO 3166-1 alpha-2 code, ex: FR returns 33
+ *@param iso country code alpha2
+ *@return call country code or -1 if not found
+ */
+LINPHONE_PUBLIC	int linphone_dial_plan_lookup_ccc_from_iso(const char* iso);
+
+/**
+ *Function to get  call country code from  an e164 number, ex: +33952650121 will return 33
+ *@param e164 phone number
+ *@return call country code or -1 if not found
+ */
+LINPHONE_PUBLIC	int linphone_dial_plan_lookup_ccc_from_e164(const char* e164);
+
+/**
+ * Return NULL-terminated array of all known dial plans
+ * @deprecated use linphone_dial_plan_get_all_list instead, this method will always return NULL
+ * @donotwrap
+**/
+LINPHONE_PUBLIC const LinphoneDialPlan* linphone_dial_plan_get_all(void);
+
+/**
+ * @return \bctbx_list{LinphoneDialPlan} of all known dial plans
+**/
+LINPHONE_PUBLIC bctbx_list_t * linphone_dial_plan_get_all_list(void);
+
+/**
+ * Find best match for given CCC
+ * @return Return matching dial plan, or a generic one if none found
+**/
+LINPHONE_PUBLIC const LinphoneDialPlan* linphone_dial_plan_by_ccc(const char *ccc);
+/**
+ * Find best match for given CCC
+ * @return Return matching dial plan, or a generic one if none found
+ **/
+LINPHONE_PUBLIC const LinphoneDialPlan* linphone_dial_plan_by_ccc_as_int(int ccc);
+
+/**
+ * Return if given plan is generic
+**/
+LINPHONE_PUBLIC bool_t linphone_dial_plan_is_generic(const LinphoneDialPlan *ccc);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_DIAL_PLAN_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-event-log.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-event-log.h"
new file mode 100644
index 0000000..7780bce
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-event-log.h"
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_EVENT_LOG_H_
+#define _L_C_EVENT_LOG_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup events
+ * @{
+ */
+
+// -----------------------------------------------------------------------------
+// EventLog.
+// -----------------------------------------------------------------------------
+
+/**
+ * Increment reference count of #LinphoneEventLog object.
+ **/
+LINPHONE_PUBLIC LinphoneEventLog *linphone_event_log_ref (LinphoneEventLog *event_log);
+
+/**
+ * Decrement reference count of #LinphoneEventLog object. When dropped to zero, memory is freed.
+ **/
+LINPHONE_PUBLIC void linphone_event_log_unref (LinphoneEventLog *event_log);
+
+/**
+ * Returns the type of a event log.
+ * @param[in] event_log A #LinphoneEventLog object
+ * @return The event type
+ */
+LINPHONE_PUBLIC LinphoneEventLogType linphone_event_log_get_type (const LinphoneEventLog *event_log);
+
+/**
+ * Returns the creation time of a event log.
+ * @param[in] event_log A #LinphoneEventLog object
+ * @return The event creation time
+ */
+LINPHONE_PUBLIC time_t linphone_event_log_get_creation_time (const LinphoneEventLog *event_log);
+
+/**
+ * Delete event log from database.
+ * @param[in] event_log A #LinphoneEventLog object
+ */
+LINPHONE_PUBLIC void linphone_event_log_delete_from_database (LinphoneEventLog *event_log);
+
+// -----------------------------------------------------------------------------
+// ConferenceEvent.
+// -----------------------------------------------------------------------------
+
+/**
+ * Returns the peer address of a conference event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The peer address.
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_event_log_get_peer_address (const LinphoneEventLog *event_log);
+
+/**
+ * Returns the local address of a conference event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The local address.
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_event_log_get_local_address (const LinphoneEventLog *event_log);
+
+// -----------------------------------------------------------------------------
+// ConferenceNotifiedEvent.
+// -----------------------------------------------------------------------------
+
+/**
+ * Returns the notify id of a conference notified event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The conference notify id.
+ */
+LINPHONE_PUBLIC unsigned int linphone_event_log_get_notify_id (const LinphoneEventLog *event_log);
+
+// -----------------------------------------------------------------------------
+// ConferenceCallEvent.
+// -----------------------------------------------------------------------------
+
+/**
+ * Returns the call of a conference call event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The conference call.
+ */
+LINPHONE_PUBLIC LinphoneCall *linphone_event_log_get_call (const LinphoneEventLog *event_log);
+
+// -----------------------------------------------------------------------------
+// ConferenceChatMessageEvent.
+// -----------------------------------------------------------------------------
+
+/**
+ * Returns the chat message of a conference chat message event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The conference chat message.
+ */
+LINPHONE_PUBLIC LinphoneChatMessage *linphone_event_log_get_chat_message (const LinphoneEventLog *event_log);
+
+// -----------------------------------------------------------------------------
+// ConferenceParticipantEvent.
+// -----------------------------------------------------------------------------
+
+/**
+ * Returns the participant address of a conference participant event.
+ * @param[in] event_log A ConferenceParticipantEvent object.
+ * @return The conference participant address.
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_event_log_get_participant_address (const LinphoneEventLog *event_log);
+
+// -----------------------------------------------------------------------------
+// ConferenceParticipantDeviceEvent.
+// -----------------------------------------------------------------------------
+
+/**
+ * Returns the device address of a conference participant device event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The conference device address.
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_event_log_get_device_address (const LinphoneEventLog *event_log);
+
+// -----------------------------------------------------------------------------
+// ConferenceSecurityEvent.
+// -----------------------------------------------------------------------------
+
+/**
+ * Returns the type of security event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The security event type.
+ */
+LINPHONE_PUBLIC LinphoneSecurityEventType linphone_event_log_get_security_event_type (const LinphoneEventLog *event_log);
+
+/**
+ * Returns the faulty device address of a conference security event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The address of the faulty device.
+ */
+LINPHONE_PUBLIC LinphoneAddress *linphone_event_log_get_security_event_faulty_device_address (const LinphoneEventLog *event_log);
+
+// -----------------------------------------------------------------------------
+// ConferenceSubjectEvent.
+// -----------------------------------------------------------------------------
+
+/**
+ * Returns the subject of a conference subject event.
+ * @param[in] event_log A #LinphoneEventLog object.
+ * @return The conference subject.
+ */
+LINPHONE_PUBLIC const char *linphone_event_log_get_subject (const LinphoneEventLog *event_log);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_EVENT_LOG_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-magic-search.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-magic-search.h"
new file mode 100644
index 0000000..0d3a6d0
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-magic-search.h"
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_MAGIC_SEARCH_H_
+#define _L_C_MAGIC_SEARCH_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Constructs a LinphoneMagicSearch object
+ **/
+LINPHONE_PUBLIC LinphoneMagicSearch *linphone_magic_search_new (LinphoneCore *lc);
+
+/**
+ * Increment reference count of LinphoneMagicSearch object.
+ **/
+LINPHONE_PUBLIC LinphoneMagicSearch *linphone_magic_search_ref (LinphoneMagicSearch *magic_search);
+
+/**
+ * Decrement reference count of LinphoneMagicSearch object. When dropped to zero, memory is freed.
+ **/
+LINPHONE_PUBLIC void linphone_magic_search_unref (LinphoneMagicSearch *magic_search);
+
+/**
+ * Set the minimum value used to calculate the weight in search
+ * @param[in] weight minimum weight
+ **/
+LINPHONE_PUBLIC void linphone_magic_search_set_min_weight (LinphoneMagicSearch *magic_search, unsigned int weight);
+
+/**
+ * @return the minimum value used to calculate the weight in search
+ **/
+LINPHONE_PUBLIC unsigned int linphone_magic_search_get_min_weight (const LinphoneMagicSearch *magic_search);
+
+/**
+ * Set the maximum value used to calculate the weight in search
+ * @param[in] weight maximum weight
+ **/
+LINPHONE_PUBLIC void linphone_magic_search_set_max_weight (LinphoneMagicSearch *magic_search, unsigned int weight);
+
+/**
+ * @return the maximum value used to calculate the weight in search
+ **/
+LINPHONE_PUBLIC unsigned int linphone_magic_search_get_max_weight (const LinphoneMagicSearch *magic_search);
+
+/**
+ * @return the delimiter used to find matched filter word
+ **/
+LINPHONE_PUBLIC const char *linphone_magic_search_get_delimiter (const LinphoneMagicSearch *magic_search);
+
+/**
+ * Set the delimiter used to find matched filter word
+ * @param[in] delimiter delimiter (example "-_.,")
+ **/
+LINPHONE_PUBLIC void linphone_magic_search_set_delimiter (LinphoneMagicSearch *magic_search, const char *delimiter);
+
+/**
+ * @return if the delimiter search is used
+ **/
+LINPHONE_PUBLIC bool_t linphone_magic_search_get_use_delimiter (LinphoneMagicSearch *magic_search);
+
+/**
+ * Enable or disable the delimiter in search
+ * @param[in] enable
+ **/
+LINPHONE_PUBLIC void linphone_magic_search_set_use_delimiter (LinphoneMagicSearch *magic_search, bool_t enable);
+
+/**
+ * @return the number of the maximum SearchResult which will be return
+ **/
+LINPHONE_PUBLIC unsigned int linphone_magic_search_get_search_limit (const LinphoneMagicSearch *magic_search);
+
+/**
+ * Set the number of the maximum SearchResult which will be return
+ * @param[in] limit
+ **/
+LINPHONE_PUBLIC void linphone_magic_search_set_search_limit (LinphoneMagicSearch *magic_search, unsigned int limit);
+
+/**
+ * @return if the search is limited
+ **/
+LINPHONE_PUBLIC bool_t linphone_magic_search_get_limited_search (const LinphoneMagicSearch *magic_search);
+
+/**
+ * Enable or disable the limited search
+ * @param[in] limited
+ **/
+LINPHONE_PUBLIC void linphone_magic_search_set_limited_search (LinphoneMagicSearch *magic_search, bool_t limited);
+
+/**
+ * Reset the cache to begin a new search
+ **/
+LINPHONE_PUBLIC void linphone_magic_search_reset_search_cache (LinphoneMagicSearch *magic_search);
+
+/**
+ * Create a sorted list of SearchResult from SipUri, Contact name,
+ * Contact displayname, Contact phone number, which match with a filter word
+ * The last item list will be an address formed with "filter" if a proxy config exist
+ * During the first search, a cache is created and used for the next search
+ * Use linphone_magic_search_reset_search_cache() to begin a new search
+ * @param[in] filter word we search
+ * @param[in] domain domain which we want to search only
+ * - "" for searching in all contact
+ * - "*" for searching in contact with sip SipUri
+ * - "yourdomain" for searching in contact from "yourdomain" domain
+ * @return sorted list of \bctbx_list{LinphoneSearchResult} \onTheFlyList
+ **/
+LINPHONE_PUBLIC bctbx_list_t *linphone_magic_search_get_contact_list_from_filter (
+	const LinphoneMagicSearch *magic_search,
+	const char *filter,
+	const char *domain
+);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _L_C_MAGIC_SEARCH_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-device-identity.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-device-identity.h"
new file mode 100644
index 0000000..47c33c7
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-device-identity.h"
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_PARTICIPANT_DEVICE_IDENTiTY_H_
+#define _L_C_PARTICIPANT_DEVICE_IDENTiTY_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Constructs a #LinphoneParticipantDeviceIdentity object.
+ **/
+LINPHONE_PUBLIC LinphoneParticipantDeviceIdentity *linphone_participant_device_identity_new (const LinphoneAddress *address, const char *name);
+
+/**
+ * Clones a #LinphoneParticipantDeviceIdentity object.
+ **/
+LINPHONE_PUBLIC LinphoneParticipantDeviceIdentity *linphone_participant_device_identity_clone (const LinphoneParticipantDeviceIdentity *deviceIdentity);
+
+/**
+ * Increment reference count of #LinphoneParticipantDeviceIdentity object.
+ **/
+LINPHONE_PUBLIC LinphoneParticipantDeviceIdentity *linphone_participant_device_identity_ref (LinphoneParticipantDeviceIdentity *deviceIdentity);
+
+/**
+ * Decrement reference count of #LinphoneParticipantDeviceIdentity object. When dropped to zero, memory is freed.
+ **/
+LINPHONE_PUBLIC void linphone_participant_device_identity_unref (LinphoneParticipantDeviceIdentity *deviceIdentity);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_PARTICIPANT_DEVICE_IDENTiTY_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-device.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-device.h"
new file mode 100644
index 0000000..539dcb4
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-device.h"
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_PARTICIPANT_DEVICE_H_
+#define _L_C_PARTICIPANT_DEVICE_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Increment reference count of #LinphoneParticipantDevice object.
+ **/
+LINPHONE_PUBLIC LinphoneParticipantDevice *linphone_participant_device_ref (LinphoneParticipantDevice *participant_device);
+
+/**
+ * Decrement reference count of #LinphoneParticipantDevice object.
+ **/
+LINPHONE_PUBLIC void linphone_participant_device_unref (LinphoneParticipantDevice *participant_device);
+
+/**
+ * Retrieve the user pointer associated with the participant's device.
+ * @param[in] participant_device A #LinphoneParticipantDevice object
+ * @return The user pointer associated with the participant's device.
+**/
+LINPHONE_PUBLIC void * linphone_participant_device_get_user_data(const LinphoneParticipantDevice *participant_device);
+
+/**
+ * Assign a user pointer to the participant's device.
+ * @param[in] participant_device A #LinphoneParticipantDevice object
+ * @param[in] ud The user pointer to associate with the participant's device
+**/
+LINPHONE_PUBLIC void linphone_participant_device_set_user_data(LinphoneParticipantDevice *participant_device, void *ud);
+
+/**
+ * Get the address of a participant's device.
+ * @param[in] participant_device A #LinphoneParticipantDevice object
+ * @return The address of the participant's device
+ */
+LINPHONE_PUBLIC const LinphoneAddress * linphone_participant_device_get_address (const LinphoneParticipantDevice *participant_device);
+
+/**
+ * Get the security level of a participant's device.
+ * @param[in] participant_device A #LinphoneParticipantDevice object
+ * @return The security level of the device
+*/
+LINPHONE_PUBLIC LinphoneChatRoomSecurityLevel linphone_participant_device_get_security_level (const LinphoneParticipantDevice *participant_device);
+
+/**
+ * Return the name of the device or NULL.
+ * @param[in] participant_device A #LinphoneParticipantDevice object
+ * @return the name of the device or NULL
+ */
+LINPHONE_PUBLIC const char *linphone_participant_device_get_name (const LinphoneParticipantDevice *LinphoneParticipantDevice);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_PARTICIPANT_DEVICE_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-imdn-state.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-imdn-state.h"
new file mode 100644
index 0000000..b03a715
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant-imdn-state.h"
@@ -0,0 +1,91 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_PARTICIPANT_IMDN_STATE_H_
+#define _L_C_PARTICIPANT_IMDN_STATE_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Increment reference count of LinphoneParticipantImdnState object.
+ **/
+LINPHONE_PUBLIC LinphoneParticipantImdnState *linphone_participant_imdn_state_ref (LinphoneParticipantImdnState *state);
+
+/**
+ * Decrement reference count of LinphoneParticipantImdnState object.
+ **/
+LINPHONE_PUBLIC void linphone_participant_imdn_state_unref (LinphoneParticipantImdnState *state);
+
+/**
+ * Retrieve the user pointer associated with a LinphoneParticipantImdnState.
+ * @param[in] state A LinphoneParticipantImdnState object
+ * @return The user pointer associated with the LinphoneParticipantImdnState.
+**/
+LINPHONE_PUBLIC void *linphone_participant_imdn_state_get_user_data(const LinphoneParticipantImdnState *state);
+
+/**
+ * Assign a user pointer to a LinphoneParticipantImdnState.
+ * @param[in] state A LinphoneParticipantImdnState object
+ * @param[in] ud The user pointer to associate with the LinphoneParticipantImdnState
+**/
+LINPHONE_PUBLIC void linphone_participant_imdn_state_set_user_data(LinphoneParticipantImdnState *state, void *ud);
+
+/**
+ * Get the participant concerned by a LinphoneParticipantImdnState.
+ * @param[in] state A LinphoneParticipantImdnState object
+ * @return The participant concerned by the LinphoneParticipantImdnState
+ */
+LINPHONE_PUBLIC const LinphoneParticipant *linphone_participant_imdn_state_get_participant (
+	const LinphoneParticipantImdnState *state
+);
+
+/**
+ * Get the chat message state the participant is in.
+ * @param state A LinphoneParticipantImdnState object
+ * @return The chat message state the participant is in
+ */
+LINPHONE_PUBLIC LinphoneChatMessageState linphone_participant_imdn_state_get_state (const LinphoneParticipantImdnState *state);
+
+/**
+ * Get the timestamp at which a participant has reached the state described by a LinphoneParticipantImdnState.
+ * @param[in] state A LinphoneParticipantImdnState object
+ * @return The timestamp at which the participant has reached the state described in the LinphoneParticipantImdnState
+ */
+LINPHONE_PUBLIC time_t linphone_participant_imdn_state_get_state_change_time (const LinphoneParticipantImdnState *state);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_PARTICIPANT_IMDN_STATE_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant.h"
new file mode 100644
index 0000000..d55376a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-participant.h"
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_PARTICIPANT_H_
+#define _L_C_PARTICIPANT_H_
+
+#include "linphone/api/c-types.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Increment reference count of #LinphoneParticipant object.
+ **/
+LINPHONE_PUBLIC LinphoneParticipant *linphone_participant_ref (LinphoneParticipant *participant);
+
+/**
+ * Decrement reference count of #LinphoneParticipant object.
+ **/
+LINPHONE_PUBLIC void linphone_participant_unref (LinphoneParticipant *participant);
+
+/**
+ * Retrieve the user pointer associated with the conference participant.
+ * @param[in] participant A #LinphoneParticipant object
+ * @return The user pointer associated with the participant.
+**/
+LINPHONE_PUBLIC void * linphone_participant_get_user_data(const LinphoneParticipant *participant);
+
+/**
+ * Assign a user pointer to the conference participant.
+ * @param[in] participant A #LinphoneParticipant object
+ * @param[in] ud The user pointer to associate with the participant
+**/
+LINPHONE_PUBLIC void linphone_participant_set_user_data(LinphoneParticipant *participant, void *ud);
+
+/**
+ * Get the address of a conference participant.
+ * @param[in] participant A #LinphoneParticipant object
+ * @return The address of the participant
+ */
+LINPHONE_PUBLIC const LinphoneAddress * linphone_participant_get_address (const LinphoneParticipant *participant);
+
+/**
+ * Tells whether a conference participant is an administrator of the conference.
+ * @param[in] participant A #LinphoneParticipant object
+ * @return A boolean value telling whether the participant is an administrator
+ */
+LINPHONE_PUBLIC bool_t linphone_participant_is_admin (const LinphoneParticipant *participant);
+
+/**
+ * Get the security level of a chat room.
+ * @param[in] cr A #LinphoneChatRoom object
+ * @return The security level of the chat room
+ */
+LINPHONE_PUBLIC LinphoneChatRoomSecurityLevel linphone_participant_get_security_level (const LinphoneParticipant *participant);
+
+/**
+ * Gets the list of devices from a chat room's participant.
+ * @param[in] participant A #LinphoneParticipant object
+ * @return \bctbx_list{LinphoneParticipantDevice}
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_participant_get_devices (const LinphoneParticipant *participant);
+
+/**
+ * Find a device in the list of devices from a chat room's participant.
+ * @param[in] participant A #LinphoneParticipant object
+ * @param[in] address A #LinphoneAddress object
+ * @return a #LinphoneParticipantDevice or NULL if not found
+ */
+LINPHONE_PUBLIC LinphoneParticipantDevice *linphone_participant_find_device (const LinphoneParticipant *participant, const LinphoneAddress *address);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_PARTICIPANT_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-search-result.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-search-result.h"
new file mode 100644
index 0000000..7e7f246
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-search-result.h"
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_SEARCH_RESULT_H_
+#define _L_C_SEARCH_RESULT_H_
+
+#include "linphone/api/c-types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Increment reference count of LinphoneSearchResult object.
+ **/
+LINPHONE_PUBLIC LinphoneSearchResult *linphone_search_result_ref(LinphoneSearchResult *searchResult);
+
+/**
+ * Decrement reference count of LinphoneSearchResult object. When dropped to zero, memory is freed.
+ **/
+LINPHONE_PUBLIC void linphone_search_result_unref(LinphoneSearchResult *searchResult);
+
+/**
+ * @return LinphoneFriend associed
+ **/
+LINPHONE_PUBLIC const LinphoneFriend* linphone_search_result_get_friend(const LinphoneSearchResult *searchResult);
+
+/**
+ * @return LinphoneAddress associed
+ **/
+LINPHONE_PUBLIC const LinphoneAddress* linphone_search_result_get_address(const LinphoneSearchResult *searchResult);
+
+/**
+ * @return Phone Number associed
+ **/
+LINPHONE_PUBLIC const char* linphone_search_result_get_phone_number(const LinphoneSearchResult *searchResult);
+
+/**
+ * @return the capabilities associated to the search result
+ **/
+LINPHONE_PUBLIC int linphone_search_result_get_capabilities(const LinphoneSearchResult *searchResult);
+
+/**
+ * @return whether a search result has a given capability
+ **/
+LINPHONE_PUBLIC bool_t linphone_search_result_has_capability(const LinphoneSearchResult *searchResult, const LinphoneFriendCapability capability);
+
+/**
+ * @return the result weight
+ **/
+LINPHONE_PUBLIC unsigned int linphone_search_result_get_weight(const LinphoneSearchResult *searchResult);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _L_C_SEARCH_RESULT_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-types.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-types.h"
new file mode 100644
index 0000000..acbe828
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/api/c-types.h"
@@ -0,0 +1,305 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_C_TYPES_H_
+#define _L_C_TYPES_H_
+
+// TODO: Remove me in the future.
+#include "linphone/types.h"
+
+#include "linphone/enums/call-enums.h"
+#include "linphone/enums/chat-message-enums.h"
+#include "linphone/enums/chat-room-enums.h"
+#include "linphone/enums/encryption-engine-enums.h"
+#include "linphone/enums/event-log-enums.h"
+#include "linphone/enums/security-event-enums.h"
+#include "linphone/utils/enum-generator.h"
+
+// =============================================================================
+
+#ifdef __cplusplus
+	extern "C" {
+#endif // ifdef __cplusplus
+
+// =============================================================================
+// Misc.
+// =============================================================================
+
+#ifdef TRUE
+	#undef TRUE
+#endif
+
+#ifdef FALSE
+	#undef FALSE
+#endif
+
+#define TRUE 1
+#define FALSE 0
+
+// =============================================================================
+// C Structures.
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// Address.
+// -----------------------------------------------------------------------------
+
+/**
+ * Object that represents a SIP address.
+ *
+ * The #LinphoneAddress is an opaque object to represents SIP addresses, ie
+ * the content of SIP's 'from' and 'to' headers.
+ * A SIP address is made of display name, username, domain name, port, and various
+ * uri headers (such as tags). It looks like 'Alice <sip:alice@example.net>'.
+ * The #LinphoneAddress has methods to extract and manipulate all parts of the address.
+ * When some part of the address (for example the username) is empty, the accessor methods
+ * return NULL.
+ * @ingroup linphone_address
+ */
+typedef struct _LinphoneAddress LinphoneAddress;
+
+// -----------------------------------------------------------------------------
+// Call.
+// -----------------------------------------------------------------------------
+
+/**
+ * The #LinphoneCall object represents a call issued or received by the #LinphoneCore
+ * @ingroup call_control
+ */
+typedef struct _LinphoneCall LinphoneCall;
+
+/** Callback prototype */
+typedef void (*LinphoneCallCbFunc) (LinphoneCall *call, void *ud);
+
+/**
+ * That class holds all the callbacks which are called by #LinphoneCall objects.
+ *
+ * Use linphone_factory_create_call_cbs() to create an instance. Then, call the
+ * callback setters on the events you need to monitor and pass the object to
+ * a #LinphoneCall instance through linphone_call_add_callbacks().
+ * @ingroup call_control
+ */
+typedef struct _LinphoneCallCbs LinphoneCallCbs;
+
+// -----------------------------------------------------------------------------
+// ChatRoom.
+// -----------------------------------------------------------------------------
+
+/**
+ * An chat message is the object that is sent and received through LinphoneChatRooms.
+ * @ingroup chatroom
+ */
+typedef struct _LinphoneChatMessage LinphoneChatMessage;
+
+/**
+ * An object to handle the callbacks for the handling a #LinphoneChatMessage objects.
+ * @ingroup chatroom
+ */
+typedef struct _LinphoneChatMessageCbs LinphoneChatMessageCbs;
+
+/**
+ * A chat room is the place where text messages are exchanged.
+ * Can be created by linphone_core_create_chat_room().
+ * @ingroup chatroom
+ */
+typedef struct _LinphoneChatRoom LinphoneChatRoom;
+
+/**
+ * An object to handle a chat room parameters.
+ * Can be created with linphone_core_get_default_chat_room_params() or linphone_chat_room_params_new().
+ * @ingroup chatroom
+ */
+typedef struct _LinphoneChatRoomParams LinphoneChatRoomParams;
+
+/**
+ * A mask of #LinphoneChatRoomCapabilities
+ * @ingroup chatroom
+ */
+typedef int LinphoneChatRoomCapabilitiesMask;
+
+/**
+ * An object to handle the callbacks for the handling a #LinphoneChatRoom objects.
+ * @ingroup chatroom
+ */
+typedef struct _LinphoneChatRoomCbs LinphoneChatRoomCbs;
+
+// -----------------------------------------------------------------------------
+// EventLog.
+// -----------------------------------------------------------------------------
+
+/**
+ * Base object of events.
+ * @ingroup events
+ */
+typedef struct _LinphoneEventLog LinphoneEventLog;
+
+// -----------------------------------------------------------------------------
+// Misc.
+// -----------------------------------------------------------------------------
+
+/**
+ * The LinphoneContent object holds data that can be embedded in a signaling message.
+ * @ingroup misc
+ */
+typedef struct _LinphoneContent LinphoneContent;
+
+/**
+ * Represents a dial plan
+ * @ingroup misc
+ */
+typedef struct _LinphoneDialPlan LinphoneDialPlan;
+
+/**
+ * A #LinphoneMagicSearch is used to do specifics searchs
+ * @ingroup misc
+ */
+typedef struct _LinphoneMagicSearch LinphoneMagicSearch;
+
+/**
+ * @ingroup misc
+ */
+typedef struct _LinphoneParticipant LinphoneParticipant;
+
+/**
+ * The LinphoneParticipantImdnState object represents the state of chat message for a participant of a conference chat room.
+ * @ingroup misc
+ */
+typedef struct _LinphoneParticipantImdnState LinphoneParticipantImdnState;
+
+/**
+ * @ingroup misc
+ */
+typedef struct _LinphoneParticipantDevice LinphoneParticipantDevice;
+
+/**
+ * @ingroup misc
+ */
+typedef struct _LinphoneParticipantDeviceIdentity LinphoneParticipantDeviceIdentity;
+
+/**
+ * The LinphoneSearchResult object represents a result of a search
+ * @ingroup misc
+ */
+typedef struct _LinphoneSearchResult LinphoneSearchResult;
+
+// =============================================================================
+// C Enums.
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// How-to: Declare one enum
+//
+// 1. Declare a macro like this example in include/linphone/enums/chat-message-enums.h:
+//
+// #define L_ENUM_VALUES_CHAT_MESSAGE_DIRECTION(F) \ //
+//   F(Incoming /**< Incoming message */) \ //
+//   F(Outgoing /**< Outgoing message */)
+//
+// 2. And in this file, call L_DECLARE_C_ENUM with the enum name and values as params:
+//
+// L_DECLARE_C_ENUM(ChatMessageDirection, L_ENUM_VALUES_CHAT_MESSAGE_DIRECTION);
+//
+// 3. Do not forget to replace each single quote (with &apos;) or other special char like
+// to an escaped sequence. Otherwise you get this error at compilation:
+//
+// [ 99%] Building CXX object wrappers/cpp/CMakeFiles/linphone++.dir/src/linphone++.cc.o
+// c++: error: WORK/desktop/Build/linphone/wrappers/cpp/src/linphone++.cc: No such file or directory
+// c++: fatal error: no input files
+// compilation terminated.
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// Call.
+// -----------------------------------------------------------------------------
+
+/**
+ * #LinphoneCallState enum represents the different states a call can reach into.
+ * The application is notified of a state change through the LinphoneCoreVTable::call_state_changed callback.
+ * @ingroup call_control
+ */
+L_DECLARE_C_ENUM(CallState, L_ENUM_VALUES_CALL_SESSION_STATE);
+
+// -----------------------------------------------------------------------------
+// ChatRoom.
+// -----------------------------------------------------------------------------
+
+/**
+ * #LinphoneChatMessageDirection is used to indicate if a message is outgoing or incoming.
+ * @ingroup chatroom
+ */
+L_DECLARE_C_ENUM(ChatMessageDirection, L_ENUM_VALUES_CHAT_MESSAGE_DIRECTION);
+
+/**
+ * #LinphoneChatMessageState is used to notify if messages have been successfully delivered or not.
+ * @ingroup chatroom
+ */
+L_DECLARE_C_ENUM(ChatMessageState, L_ENUM_VALUES_CHAT_MESSAGE_STATE);
+
+/**
+ * #LinphoneChatRoomCapabilities is used to indicate the capabilities of a chat room.
+ * @ingroup chatroom
+ */
+L_DECLARE_C_ENUM_FIXED_VALUES(ChatRoomCapabilities, L_ENUM_VALUES_CHAT_ROOM_CAPABILITIES);
+
+/**
+ * #LinphoneChatRoomBackend is used to indicate the backend implementation of a chat room.
+ * @ingroup chatroom
+ */
+L_DECLARE_C_ENUM_FIXED_VALUES(ChatRoomBackend, L_ENUM_VALUES_CHAT_ROOM_BACKEND);
+
+/**
+ * #LinphoneChatRoomEncryptionBackend is used to indicate the encryption engine used by a chat room.
+ * @ingroup chatroom
+ */
+L_DECLARE_C_ENUM_FIXED_VALUES(ChatRoomEncryptionBackend, L_ENUM_VALUES_CHAT_ROOM_ENCRYPTION_BACKEND);
+
+/**
+ * TODO move to encryption engine object when available
+ * #LinphoneChatRoomSecurityLevel is used to indicate the encryption security level of a chat room.
+ * @ingroup chatroom
+ */
+L_DECLARE_C_ENUM(ChatRoomSecurityLevel, L_ENUM_VALUES_ENCRYPTION_ENGINE_SECURITY_LEVEL);
+
+/**
+ * #LinphoneChatRoomState is used to indicate the current state of a chat room.
+ * @ingroup chatroom
+ */
+L_DECLARE_C_ENUM(ChatRoomState, L_ENUM_VALUES_CHAT_ROOM_STATE);
+
+// -----------------------------------------------------------------------------
+// EventLog.
+// -----------------------------------------------------------------------------
+
+/**
+ * #LinphoneEventLogType is used to indicate the type of an event. Useful for cast.
+ * @ingroup events
+ */
+L_DECLARE_C_ENUM(EventLogType, L_ENUM_VALUES_EVENT_LOG_TYPE);
+
+/**
+ * #LinphoneSecurityEventType is used to indicate the type of security event.
+ * @ingroup events
+ */
+L_DECLARE_C_ENUM(SecurityEventType, L_ENUM_VALUES_SECURITY_EVENT_TYPE);
+
+#ifdef __cplusplus
+	}
+#endif // ifdef __cplusplus
+
+#endif // ifndef _L_C_TYPES_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/buffer.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/buffer.h"
new file mode 100644
index 0000000..a16cc53
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/buffer.h"
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_BUFFER_H_
+#define LINPHONE_BUFFER_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Create a new empty #LinphoneBuffer object.
+ * @return A new #LinphoneBuffer object.
+ */
+LINPHONE_PUBLIC LinphoneBuffer * linphone_buffer_new(void);
+
+/**
+ * Create a new #LinphoneBuffer object from existing data.
+ * @param[in] data The initial data to store in the LinphoneBuffer.
+ * @param[in] size The size of the initial data to stroe in the LinphoneBuffer.
+ * @return A new #LinphoneBuffer object.
+ */
+LINPHONE_PUBLIC LinphoneBuffer * linphone_buffer_new_from_data(const uint8_t *data, size_t size);
+
+/**
+ * Create a new #LinphoneBuffer object from a string.
+ * @param[in] data The initial string content of the LinphoneBuffer.
+ * @return A new #LinphoneBuffer object.
+ */
+LINPHONE_PUBLIC LinphoneBuffer * linphone_buffer_new_from_string(const char *data);
+
+/**
+ * Acquire a reference to the buffer.
+ * @param[in] buffer #LinphoneBuffer object.
+ * @return The same #LinphoneBuffer object.
+**/
+LINPHONE_PUBLIC LinphoneBuffer * linphone_buffer_ref(LinphoneBuffer *buffer);
+
+/**
+ * Release reference to the buffer.
+ * @param[in] buffer #LinphoneBuffer object.
+**/
+LINPHONE_PUBLIC void linphone_buffer_unref(LinphoneBuffer *buffer);
+
+/**
+ * Retrieve the user pointer associated with the buffer.
+ * @param[in] buffer #LinphoneBuffer object.
+ * @return The user pointer associated with the buffer.
+**/
+LINPHONE_PUBLIC void *linphone_buffer_get_user_data(const LinphoneBuffer *buffer);
+
+/**
+ * Assign a user pointer to the buffer.
+ * @param[in] buffer #LinphoneBuffer object.
+ * @param[in] ud The user pointer to associate with the buffer.
+**/
+LINPHONE_PUBLIC void linphone_buffer_set_user_data(LinphoneBuffer *buffer, void *ud);
+
+/**
+ * Get the content of the data buffer.
+ * @param[in] buffer #LinphoneBuffer object.
+ * @return The content of the data buffer.
+ */
+LINPHONE_PUBLIC const uint8_t * linphone_buffer_get_content(const LinphoneBuffer *buffer);
+
+/**
+ * Set the content of the data buffer.
+ * @param[in] buffer #LinphoneBuffer object.
+ * @param[in] content The content of the data buffer.
+ * @param[in] size The size of the content of the data buffer.
+ */
+LINPHONE_PUBLIC void linphone_buffer_set_content(LinphoneBuffer *buffer, const uint8_t *content, size_t size);
+
+/**
+ * Get the string content of the data buffer.
+ * @param[in] buffer #LinphoneBuffer object
+ * @return The string content of the data buffer.
+ */
+LINPHONE_PUBLIC const char * linphone_buffer_get_string_content(const LinphoneBuffer *buffer);
+
+/**
+ * Set the string content of the data buffer.
+ * @param[in] buffer #LinphoneBuffer object.
+ * @param[in] content The string content of the data buffer.
+ */
+LINPHONE_PUBLIC void linphone_buffer_set_string_content(LinphoneBuffer *buffer, const char *content);
+
+/**
+ * Get the size of the content of the data buffer.
+ * @param[in] buffer #LinphoneBuffer object.
+ * @return The size of the content of the data buffer.
+ */
+LINPHONE_PUBLIC size_t linphone_buffer_get_size(const LinphoneBuffer *buffer);
+
+/**
+ * Set the size of the content of the data buffer.
+ * @param[in] buffer #LinphoneBuffer object
+ * @param[in] size The size of the content of the data buffer.
+ */
+LINPHONE_PUBLIC void linphone_buffer_set_size(LinphoneBuffer *buffer, size_t size);
+
+/**
+ * Tell whether the #LinphoneBuffer is empty.
+ * @param[in] buffer #LinphoneBuffer object
+ * @return A boolean value telling whether the #LinphoneBuffer is empty or not.
+ */
+LINPHONE_PUBLIC bool_t linphone_buffer_is_empty(const LinphoneBuffer *buffer);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_BUFFER_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call.h"
new file mode 100644
index 0000000..2c64718
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call.h"
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_CALL_H
+#define LINPHONE_CALL_H
+
+#include "linphone/api/c-call.h"
+#include "linphone/api/c-call-cbs.h"
+#include "linphone/api/c-call-stats.h"
+
+#endif /* LINPHONE_CALL_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_log.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_log.h"
new file mode 100644
index 0000000..df9d4dd
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_log.h"
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __LINPHONE_CALL_LOG_H__
+#define __LINPHONE_CALL_LOG_H__
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup call_logs
+ * @{
+**/
+
+/*******************************************************************************
+ * Public functions                                                            *
+ ******************************************************************************/
+
+/**
+ * Get the call ID used by the call.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The call ID used by the call as a string.
+**/
+LINPHONE_PUBLIC const char * linphone_call_log_get_call_id(const LinphoneCallLog *cl);
+
+/**
+ * Get the direction of the call.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The direction of the call.
+**/
+LINPHONE_PUBLIC LinphoneCallDir linphone_call_log_get_dir(const LinphoneCallLog *cl);
+
+/**
+ * Get the duration of the call since connected.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The duration of the call in seconds.
+**/
+LINPHONE_PUBLIC int linphone_call_log_get_duration(const LinphoneCallLog *cl);
+
+/**
+ * Get the origin address (ie from) of the call.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The origin address (ie from) of the call.
+**/
+LINPHONE_PUBLIC const LinphoneAddress * linphone_call_log_get_from_address(const LinphoneCallLog *cl);
+
+/**
+ * Get the RTP statistics computed locally regarding the call.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The RTP statistics that have been computed locally for the call.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC const rtp_stats_t * linphone_call_log_get_local_stats(const LinphoneCallLog *cl);
+
+/**
+ * Get the overall quality indication of the call.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The overall quality indication of the call.
+**/
+LINPHONE_PUBLIC float linphone_call_log_get_quality(const LinphoneCallLog *cl);
+
+/**
+ * Get the persistent reference key associated to the call log.
+ *
+ * The reference key can be for example an id to an external database.
+ * It is stored in the config file, thus can survive to process exits/restarts.
+ *
+ * @param[in] cl #LinphoneCallLog object
+ * @return The reference key string that has been associated to the call log, or NULL if none has been associated.
+**/
+LINPHONE_PUBLIC const char * linphone_call_log_get_ref_key(const LinphoneCallLog *cl);
+
+/**
+ * Get the local address (that is from or to depending on call direction)
+ * @param[in] cl LinphoneCallLog object
+ * @return The local address of the call
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_call_log_get_local_address(const LinphoneCallLog *cl);
+
+/**
+ * Get the remote address (that is from or to depending on call direction).
+ * @param[in] cl #LinphoneCallLog object
+ * @return The remote address of the call.
+**/
+LINPHONE_PUBLIC const LinphoneAddress * linphone_call_log_get_remote_address(const LinphoneCallLog *cl);
+
+/**
+ * Get the RTP statistics computed by the remote end and sent back via RTCP.
+ * @note Not implemented yet.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The RTP statistics that have been computed by the remote end for the call.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC const rtp_stats_t * linphone_call_log_get_remote_stats(const LinphoneCallLog *cl);
+
+/**
+ * Get the start date of the call.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The date of the beginning of the call.
+**/
+LINPHONE_PUBLIC time_t linphone_call_log_get_start_date(const LinphoneCallLog *cl);
+
+/**
+ * Get the status of the call.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The status of the call.
+**/
+LINPHONE_PUBLIC LinphoneCallStatus linphone_call_log_get_status(const LinphoneCallLog *cl);
+
+/**
+ * Get the destination address (ie to) of the call.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The destination address (ie to) of the call.
+**/
+LINPHONE_PUBLIC const LinphoneAddress * linphone_call_log_get_to_address(const LinphoneCallLog *cl);
+
+/**
+ * Associate a persistent reference key to the call log.
+ *
+ * The reference key can be for example an id to an external database.
+ * It is stored in the config file, thus can survive to process exits/restarts.
+ *
+ * @param[in] cl #LinphoneCallLog object
+ * @param[in] refkey The reference key string to associate to the call log.
+**/
+LINPHONE_PUBLIC void linphone_call_log_set_ref_key(LinphoneCallLog *cl, const char *refkey);
+
+/**
+ * Tell whether video was enabled at the end of the call or not.
+ * @param[in] cl #LinphoneCallLog object
+ * @return A boolean value telling whether video was enabled at the end of the call.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_log_video_enabled(const LinphoneCallLog *cl);
+
+/**
+ * Get a human readable string describing the call.
+ * @note: the returned string must be freed by the application (use ms_free()).
+ * @param[in] cl #LinphoneCallLog object
+ * @return A human readable string describing the call.
+**/
+LINPHONE_PUBLIC char * linphone_call_log_to_str(const LinphoneCallLog *cl);
+
+/**
+ * Tells whether that call was a call to a conference server
+ * @param[in] cl #LinphoneCallLog object
+ * @return TRUE if the call was a call to a conference server
+ */
+LINPHONE_PUBLIC bool_t linphone_call_log_was_conference(const LinphoneCallLog *cl);
+
+/**
+ * When the call was failed, return an object describing the failure.
+ * @param[in] cl #LinphoneCallLog object
+ * @return information about the error encountered by the call associated with this call log.
+**/
+LINPHONE_PUBLIC const LinphoneErrorInfo *linphone_call_log_get_error_info(const LinphoneCallLog *cl);
+
+
+/*******************************************************************************
+ * Reference and user data handling functions                                  *
+ ******************************************************************************/
+
+/**
+ * Get the user data associated with the call log.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The user data associated with the call log.
+**/
+LINPHONE_PUBLIC void *linphone_call_log_get_user_data(const LinphoneCallLog *cl);
+
+/**
+ * Assign a user data to the call log.
+ * @param[in] cl #LinphoneCallLog object
+ * @param[in] ud The user data to associate with the call log.
+**/
+LINPHONE_PUBLIC void linphone_call_log_set_user_data(LinphoneCallLog *cl, void *ud);
+
+/**
+ * Acquire a reference to the call log.
+ * @param[in] cl #LinphoneCallLog object
+ * @return The same #LinphoneCallLog object
+**/
+LINPHONE_PUBLIC LinphoneCallLog * linphone_call_log_ref(LinphoneCallLog *cl);
+
+/**
+ * Release a reference to the call log.
+ * @param[in] cl #LinphoneCallLog object
+**/
+LINPHONE_PUBLIC void linphone_call_log_unref(LinphoneCallLog *cl);
+
+/**
+ * Creates a fake LinphoneCallLog.
+ * @param[in] lc LinphoneCore object
+ * @param[in] from LinphoneAddress of caller
+ * @param[in] to LinphoneAddress of callee
+ * @param[in] dir LinphoneCallDir of call
+ * @param[in] duration call length in seconds
+ * @param[in] start_time timestamp of call start time
+ * @param[in] connected_time timestamp of call connection
+ * @param[in] status LinphoneCallStatus of call
+ * @param[in] video_enabled whether video was enabled or not for this call
+ * @param[in] quality call quality
+ * @return LinphoneCallLog object
+**/
+LINPHONE_PUBLIC LinphoneCallLog *linphone_core_create_call_log(LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, LinphoneCallDir dir, 
+		int duration, time_t start_time, time_t connected_time, LinphoneCallStatus status, bool_t video_enabled, float quality);
+
+
+/*******************************************************************************
+ * DEPRECATED                                                                  *
+ ******************************************************************************/
+
+/** @deprecated Use linphone_call_log_get_from_address() instead. */
+#define linphone_call_log_get_from(cl) linphone_call_log_get_from_address(cl)
+
+/** @deprecated Use linphone_call_log_get_to_address() instead. */
+#define linphone_call_log_get_to(cl) linphone_call_log_get_to_address(cl)
+
+/** @deprecated Use linphone_call_log_set_user_data() instead. */
+#define linphone_call_log_set_user_pointer(cl, ud) linphone_call_log_set_user_data(cl, ud)
+
+/** @deprecated Use linphone_call_log_get_user_data() instead. */
+#define linphone_call_log_get_user_pointer(cl) linphone_call_log_get_user_data(cl)
+
+/**
+ * Destroy a LinphoneCallLog.
+ * @param cl #LinphoneCallLog object
+ * @deprecated Use linphone_call_log_unref() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_call_log_destroy(LinphoneCallLog *cl);
+
+/**
+ * @}
+**/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __LINPHONE_CALL_LOG_H__ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_params.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_params.h"
new file mode 100644
index 0000000..4a0fd80
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_params.h"
@@ -0,0 +1,515 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef __LINPHONE_CALL_PARAMS_H__
+#define __LINPHONE_CALL_PARAMS_H__
+
+
+#include "linphone/types.h"
+#include "linphone/payload_type.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup call_control
+ * @{
+**/
+
+/*******************************************************************************
+ * Public functions                                                            *
+ ******************************************************************************/
+
+/**
+ * Add a custom SIP header in the INVITE for a call.
+ * @param[in] cp The #LinphoneCallParams to add a custom SIP header to.
+ * @param[in] header_name The name of the header to add.
+ * @param[in] header_value The content of the header to add.
+**/
+LINPHONE_PUBLIC void linphone_call_params_add_custom_header(LinphoneCallParams *cp, const char *header_name, const char *header_value);
+
+/**
+ * Copy an existing #LinphoneCallParams object to a new #LinphoneCallParams object.
+ * @param[in] cp The #LinphoneCallParams object to copy.
+ * @return A copy of the #LinphoneCallParams object.
+**/
+LINPHONE_PUBLIC LinphoneCallParams * linphone_call_params_copy(const LinphoneCallParams *cp);
+
+/**
+ * Indicate whether sending of early media was enabled.
+ * @param[in] cp #LinphoneCallParams object
+ * @return A boolean value telling whether sending of early media was enabled.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_params_early_media_sending_enabled(const LinphoneCallParams *cp);
+
+/**
+ * Enable sending of real early media (during outgoing calls).
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] enabled A boolean value telling whether to enable early media sending or not.
+**/
+LINPHONE_PUBLIC void linphone_call_params_enable_early_media_sending(LinphoneCallParams *cp, bool_t enabled);
+
+/**
+ * Indicate low bandwith mode.
+ * Configuring a call to low bandwidth mode will result in the core to activate several settings for the call in order to ensure that bitrate usage
+ * is lowered to the minimum possible. Typically, ptime (packetization time) will be increased, audio codec's output bitrate will be targetted to 20kbit/s provided
+ * that it is achievable by the codec selected after SDP handshake. Video is automatically disabled.
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] enabled A boolean value telling whether to activate the low bandwidth mode or not.
+**/
+LINPHONE_PUBLIC void linphone_call_params_enable_low_bandwidth(LinphoneCallParams *cp, bool_t enabled);
+
+/**
+ * Enable audio stream.
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] enabled A boolean value telling whether to enable audio or not.
+**/
+LINPHONE_PUBLIC void linphone_call_params_enable_audio(LinphoneCallParams *cp, bool_t enabled);
+
+/**
+ * Enable video stream.
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] enabled A boolean value telling whether to enable video or not.
+**/
+LINPHONE_PUBLIC void linphone_call_params_enable_video(LinphoneCallParams *cp, bool_t enabled);
+
+/**
+ * Get a custom SIP header.
+ * @param[in] cp The #LinphoneCallParams to get the custom SIP header from.
+ * @param[in] header_name The name of the header to get.
+ * @return The content of the header or NULL if not found.
+**/
+LINPHONE_PUBLIC const char *linphone_call_params_get_custom_header(const LinphoneCallParams *cp, const char *header_name);
+
+/**
+ * Tell whether the call is part of the locally managed conference.
+ * @warning If a conference server is used to manage conferences,
+ * that function does not return TRUE even if the conference is running.<br/>
+ * If you want to test whether the conference is running, you should test
+ * whether linphone_core_get_conference() return a non-null pointer.
+ * @param[in] cp #LinphoneCallParams object
+ * @return A boolean value telling whether the call is part of the locally managed conference.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_params_get_local_conference_mode(const LinphoneCallParams *cp);
+
+/**
+ * Get the kind of media encryption selected for the call.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The kind of media encryption selected for the call.
+**/
+LINPHONE_PUBLIC LinphoneMediaEncryption linphone_call_params_get_media_encryption(const LinphoneCallParams *cp);
+
+/**
+ * Get requested level of privacy for the call.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The privacy mode used for the call.
+**/
+LINPHONE_PUBLIC LinphonePrivacyMask linphone_call_params_get_privacy(const LinphoneCallParams *cp);
+
+/**
+ * Get the framerate of the video that is received.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The actual received framerate in frames per seconds, 0 if not available.
+ */
+LINPHONE_PUBLIC float linphone_call_params_get_received_framerate(const LinphoneCallParams *cp);
+
+/**
+ * Get the definition of the received video.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The received #LinphoneVideoDefinition
+ */
+LINPHONE_PUBLIC const LinphoneVideoDefinition * linphone_call_params_get_received_video_definition(const LinphoneCallParams *cp);
+
+/**
+ * @brief Get the size of the video that is received.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The received video size or MS_VIDEO_SIZE_UNKNOWN if not available.
+ * @deprecated Use #linphone_call_params_get_received_video_definition() instead. Deprecated since 2017-03-28.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED MSVideoSize linphone_call_params_get_received_video_size(const LinphoneCallParams *cp);
+
+/**
+ * Get the path for the audio recording of the call.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The path to the audio recording of the call.
+**/
+LINPHONE_PUBLIC const char *linphone_call_params_get_record_file(const LinphoneCallParams *cp);
+
+/**
+ * Get the RTP profile being used.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The RTP profile.
+ */
+LINPHONE_PUBLIC const char * linphone_call_params_get_rtp_profile(const LinphoneCallParams *cp);
+
+/**
+ * Get the framerate of the video that is sent.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The actual sent framerate in frames per seconds, 0 if not available.
+ */
+LINPHONE_PUBLIC float linphone_call_params_get_sent_framerate(const LinphoneCallParams *cp);
+
+/**
+ * Get the definition of the sent video.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The sent #LinphoneVideoDefinition
+ */
+LINPHONE_PUBLIC const LinphoneVideoDefinition * linphone_call_params_get_sent_video_definition(const LinphoneCallParams *cp);
+
+/**
+ * @brief Gets the size of the video that is sent.
+ * @param[in] cp #LinphoneCalParams object
+ * @return The sent video size or MS_VIDEO_SIZE_UNKNOWN if not available.
+ * @deprecated Use #linphone_call_params_get_sent_video_definition() instead. Deprecated since 2017-03-28.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED MSVideoSize linphone_call_params_get_sent_video_size(const LinphoneCallParams *cp);
+
+/**
+ * Get the session name of the media session (ie in SDP).
+ * Subject from the SIP message can be retrieved using linphone_call_params_get_custom_header() and is different.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The session name of the media session.
+**/
+LINPHONE_PUBLIC const char *linphone_call_params_get_session_name(const LinphoneCallParams *cp);
+
+/**
+ * Get the audio payload type that has been selected by a call.
+ * @param[in] cp The call.
+ * @return The selected payload type. NULL is returned if no audio payload type has been seleced
+ * by the call.
+**/
+LINPHONE_PUBLIC LinphonePayloadType *linphone_call_params_get_used_audio_payload_type(const LinphoneCallParams *cp);
+
+/**
+ * Get the video payload type that has been selected by a call.
+ * @param[in] cp The call.
+ * @return The selected payload type. NULL is returned if no video payload type has been seleced
+ * by the call.
+**/
+LINPHONE_PUBLIC LinphonePayloadType *linphone_call_params_get_used_video_payload_type(const LinphoneCallParams *cp);
+
+/**
+ * Get the text payload type that has been selected by a call.
+ * @param[in] cp The call.
+ * @return The selected payload type. NULL is returned if no text payload type has been seleced
+ * by the call.
+**/
+LINPHONE_PUBLIC LinphonePayloadType *linphone_call_params_get_used_text_payload_type(const LinphoneCallParams *cp);
+
+/**
+ * Get the audio payload type that has been selected by a call.
+ * @param[in] cp The call.
+ * @return The selected payload type. NULL is returned if no audio payload type has been seleced by the call.
+ * @deprecated Use linphone_call_params_get_used_audio_payload_type() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const OrtpPayloadType *linphone_call_params_get_used_audio_codec(const LinphoneCallParams *cp);
+
+/**
+ * Get the video payload type that has been selected by a call.
+ * @param[in] cp The call.
+ * @return The selected payload type. NULL is returned if no video payload type has been seleced by the call.
+ * @deprecated Use linphone_call_params_get_used_video_payload_type() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const OrtpPayloadType *linphone_call_params_get_used_video_codec(const LinphoneCallParams *cp);
+
+/**
+ * Get the text payload type that has been selected by a call.
+ * @param[in] cp The call.
+ * @return The selected payload type. NULL is returned if no text payload type has been seleced by the call.
+ * @deprecated Use linphone_call_params_get_used_text_payload_type() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const OrtpPayloadType *linphone_call_params_get_used_text_codec(const LinphoneCallParams *cp);
+
+/**
+ * Tell whether the call has been configured in low bandwidth mode or not.
+ * This mode can be automatically discovered thanks to a stun server when activate_edge_workarounds=1 in section [net] of configuration file.
+ * An application that would have reliable way to know network capacity may not use activate_edge_workarounds=1 but instead manually configure
+ * low bandwidth mode with linphone_call_params_enable_low_bandwidth().
+ * When enabled, this param may transform a call request with video in audio only mode.
+ * @param[in] cp #LinphoneCallParams object
+ * @return A boolean value telling whether the low bandwidth mode has been configured/detected.
+ */
+LINPHONE_PUBLIC bool_t linphone_call_params_low_bandwidth_enabled(const LinphoneCallParams *cp);
+
+/**
+ * Refine bandwidth settings for this call by setting a bandwidth limit for audio streams.
+ * As a consequence, codecs whose bitrates are not compatible with this limit won't be used.
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] bw The audio bandwidth limit to set in kbit/s.
+**/
+LINPHONE_PUBLIC void linphone_call_params_set_audio_bandwidth_limit(LinphoneCallParams *cp, int bw);
+
+/**
+ * Set requested media encryption for a call.
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] enc The media encryption to use for the call.
+**/
+LINPHONE_PUBLIC void linphone_call_params_set_media_encryption(LinphoneCallParams *cp, LinphoneMediaEncryption enc);
+
+/**
+ * Set requested level of privacy for the call.
+ * \xmlonly <language-tags>javascript</language-tags> \endxmlonly
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] privacy The privacy mode to used for the call.
+**/
+LINPHONE_PUBLIC void linphone_call_params_set_privacy(LinphoneCallParams *cp, LinphonePrivacyMask privacy);
+
+/**
+ * Enable recording of the call.
+ * This function must be used before the call parameters are assigned to the call.
+ * The call recording can be started and paused after the call is established with
+ * linphone_call_start_recording() and linphone_call_pause_recording().
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] path A string containing the path and filename of the file where audio/video streams are to be written.
+ * The filename must have either .mkv or .wav extention. The video stream will be written only if a MKV file is given.
+**/
+LINPHONE_PUBLIC void linphone_call_params_set_record_file(LinphoneCallParams *cp, const char *path);
+
+/**
+ * Set the session name of the media session (ie in SDP).
+ * Subject from the SIP message (which is different) can be set using linphone_call_params_set_custom_header().
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] name The session name to be used.
+**/
+LINPHONE_PUBLIC void linphone_call_params_set_session_name(LinphoneCallParams *cp, const char *name);
+
+/**
+ * Tell whether audio is enabled or not.
+ * @param[in] cp #LinphoneCallParams object
+ * @return A boolean value telling whether audio is enabled or not.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_params_audio_enabled(const LinphoneCallParams *cp);
+
+/**
+ * Tell whether video is enabled or not.
+ * @param[in] cp #LinphoneCallParams object
+ * @return A boolean value telling whether video is enabled or not.
+**/
+LINPHONE_PUBLIC bool_t linphone_call_params_video_enabled(const LinphoneCallParams *cp);
+
+/**
+ * Get the audio stream direction.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The audio stream direction associated with the call params.
+**/
+LINPHONE_PUBLIC  LinphoneMediaDirection linphone_call_params_get_audio_direction(const LinphoneCallParams *cp);
+
+/**
+ * Get the video stream direction.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The video stream direction associated with the call params.
+**/
+LINPHONE_PUBLIC  LinphoneMediaDirection linphone_call_params_get_video_direction(const LinphoneCallParams *cp);
+
+/**
+ * Set the audio stream direction.
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] dir The audio stream direction associated with this call params.
+**/
+LINPHONE_PUBLIC void linphone_call_params_set_audio_direction(LinphoneCallParams *cp, LinphoneMediaDirection dir);
+
+/**
+ * Set the video stream direction.
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] dir The video stream direction associated with this call params.
+**/
+LINPHONE_PUBLIC void linphone_call_params_set_video_direction(LinphoneCallParams *cp, LinphoneMediaDirection dir);
+
+
+int linphone_call_params_get_audio_bandwidth_limit(const LinphoneCallParams *params);
+bool_t linphone_call_params_real_early_media_enabled(const LinphoneCallParams *params);
+bool_t linphone_call_params_avpf_enabled(const LinphoneCallParams *params);
+void linphone_call_params_enable_avpf(LinphoneCallParams *params, bool_t enable);
+bool_t linphone_call_params_mandatory_media_encryption_enabled(const LinphoneCallParams *params);
+void linphone_call_params_enable_mandatory_media_encryption(LinphoneCallParams *params, bool_t value);
+uint16_t linphone_call_params_get_avpf_rr_interval(const LinphoneCallParams *params);
+void linphone_call_params_set_avpf_rr_interval(LinphoneCallParams *params, uint16_t value);
+
+
+/*******************************************************************************
+ * Reference and user data handling functions                                  *
+ ******************************************************************************/
+
+/**
+ * Get the user data associated with the call params.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The user data associated with the call params.
+**/
+LINPHONE_PUBLIC void *linphone_call_params_get_user_data(const LinphoneCallParams *cp);
+
+/**
+ * Assign a user data to the call params.
+ * @param[in] cp #LinphoneCallParams object
+ * @param[in] ud The user data to associate with the call params.
+**/
+LINPHONE_PUBLIC void linphone_call_params_set_user_data(LinphoneCallParams *cp, void *ud);
+
+/**
+ * Acquire a reference to the call params.
+ * @param[in] cp #LinphoneCallParams object
+ * @return The same #LinphoneCallParams object
+**/
+LINPHONE_PUBLIC LinphoneCallParams * linphone_call_params_ref(LinphoneCallParams *cp);
+
+/**
+ * Release a reference to the call params.
+ * @param[in] cp #LinphoneCallParams object
+**/
+LINPHONE_PUBLIC void linphone_call_params_unref(LinphoneCallParams *cp);
+
+
+/**
+ * Use to enable multicast rtp for audio stream.
+ * * If enabled, outgoing calls put a multicast address from #linphone_core_get_video_multicast_addr into audio cline. In case of outgoing call audio stream is sent to this multicast address.
+ * <br> For incoming calls behavior is unchanged.
+ * @param params #LinphoneCallParams
+ * @param yesno if yes, subsequent calls will propose multicast ip set by #linphone_core_set_audio_multicast_addr
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_call_params_enable_audio_multicast(LinphoneCallParams *params, bool_t yesno);
+
+/**
+ * Use to get multicast state of audio stream.
+ * @param params #LinphoneCallParams
+ * @return true if  subsequent calls will propose multicast ip set by #linphone_core_set_audio_multicast_addr
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_call_params_audio_multicast_enabled(const LinphoneCallParams *params);
+
+/**
+ * Use to enable multicast rtp for video stream.
+ * If enabled, outgoing calls put a multicast address from #linphone_core_get_video_multicast_addr into video cline. In case of outgoing call video stream is sent to this  multicast address.
+ * <br> For incoming calls behavior is unchanged.
+ * @param params #LinphoneCallParams
+ * @param yesno if yes, subsequent outgoing calls will propose multicast ip set by #linphone_core_set_video_multicast_addr
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_call_params_enable_video_multicast(LinphoneCallParams *params, bool_t yesno);
+
+/**
+ * Use to get multicast state of video stream.
+ * @param params #LinphoneCallParams
+ * @return true if  subsequent calls will propose multicast ip set by #linphone_core_set_video_multicast_addr
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_call_params_video_multicast_enabled(const LinphoneCallParams *params);
+
+/**
+ * Use to enable real time text following rfc4103.
+ * If enabled, outgoing calls put a m=text line in SDP offer .
+ * @param params #LinphoneCallParams
+ * @param yesno if yes, subsequent outgoing calls will propose rtt
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_call_params_enable_realtime_text(LinphoneCallParams *params, bool_t yesno);
+
+/**
+ * Use to get real time text following rfc4103.
+ * @param params #LinphoneCallParams
+ * @returns returns true if call rtt is activated.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_call_params_realtime_text_enabled(const LinphoneCallParams *params);
+
+/**
+ * Add a custom attribute related to all the streams in the SDP exchanged within SIP messages during a call.
+ * @param[in] params The #LinphoneCallParams to add a custom SDP attribute to.
+ * @param[in] attribute_name The name of the attribute to add.
+ * @param[in] attribute_value The content value of the attribute to add.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_call_params_add_custom_sdp_attribute(LinphoneCallParams *params, const char *attribute_name, const char *attribute_value);
+
+/**
+ * Add a custom attribute related to a specific stream in the SDP exchanged within SIP messages during a call.
+ * @param[in] params The #LinphoneCallParams to add a custom SDP attribute to.
+ * @param[in] type The type of the stream to add a custom SDP attribute to.
+ * @param[in] attribute_name The name of the attribute to add.
+ * @param[in] attribute_value The content value of the attribute to add.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_call_params_add_custom_sdp_media_attribute(LinphoneCallParams *params, LinphoneStreamType type, const char *attribute_name, const char *attribute_value);
+
+/**
+ * Get a custom SDP attribute that is related to all the streams.
+ * @param[in] params The #LinphoneCallParams to get the custom SDP attribute from.
+ * @param[in] attribute_name The name of the attribute to get.
+ * @return The content value of the attribute or NULL if not found.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char * linphone_call_params_get_custom_sdp_attribute(const LinphoneCallParams *params, const char *attribute_name);
+
+/**
+ * Get a custom SDP attribute that is related to a specific stream.
+ * @param[in] params The #LinphoneCallParams to get the custom SDP attribute from.
+ * @param[in] type The type of the stream to add a custom SDP attribute to.
+ * @param[in] attribute_name The name of the attribute to get.
+ * @return The content value of the attribute or NULL if not found.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char * linphone_call_params_get_custom_sdp_media_attribute(const LinphoneCallParams *params, LinphoneStreamType type, const char *attribute_name);
+
+/**
+ * Clear the custom SDP attributes related to all the streams in the SDP exchanged within SIP messages during a call.
+ * @param[in] params The #LinphoneCallParams to clear the custom SDP attributes from.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_call_params_clear_custom_sdp_attributes(LinphoneCallParams *params);
+
+/**
+ * Clear the custom SDP attributes related to a specific stream in the SDP exchanged within SIP messages during a call.
+ * @param[in] params The #LinphoneCallParams to clear the custom SDP attributes from.
+ * @param[in] type The type of the stream to clear the custom SDP attributes from.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_call_params_clear_custom_sdp_media_attributes(LinphoneCallParams *params, LinphoneStreamType type);
+
+
+/*******************************************************************************
+ * DEPRECATED                                                                  *
+ ******************************************************************************/
+
+/** @deprecated Use linphone_call_params_get_local_conference_mode() instead. */
+#define linphone_call_params_local_conference_mode linphone_call_params_get_local_conference_mode
+
+/**
+ * Destroy a #LinphoneCallParams object.
+ * @param[in] cp #LinphoneCallParams object
+ * @deprecated Use linphone_call_params_unref() instead.
+ * @donotwrap
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_call_params_destroy(LinphoneCallParams *cp);
+
+/**
+ * @}
+**/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __LINPHONE_CALL_PARAMS_H__ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_stats.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_stats.h"
new file mode 100644
index 0000000..328189b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/call_stats.h"
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_CALL_STATS_H
+#define LINPHONE_CALL_STATS_H
+
+#include "linphone/api/c-call-stats.h"
+
+#endif /* LINPHONE_CALL_STATS_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/callbacks.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/callbacks.h"
new file mode 100644
index 0000000..c3924b7
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/callbacks.h"
@@ -0,0 +1,654 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_CALLBACKS_H_
+#define LINPHONE_CALLBACKS_H_
+
+
+#include "linphone/types.h"
+#include "linphone/api/c-callbacks.h"
+
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+/**
+ * @}
+**/
+
+/**
+ * @addtogroup initializing
+ * @{
+**/
+
+/**
+ * Callback notifying that a new #LinphoneCall (either incoming or outgoing) has been created.
+ * @param[in] lc #LinphoneCore object that has created the call
+ * @param[in] call The newly created #LinphoneCall object
+ */
+typedef void (*LinphoneCoreCbsCallCreatedCb)(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * Global state notification callback.
+ * @param lc the #LinphoneCore.
+ * @param gstate the global state
+ * @param message informational message.
+ */
+typedef void (*LinphoneCoreCbsGlobalStateChangedCb)(LinphoneCore *lc, LinphoneGlobalState gstate, const char *message);
+
+/**
+ * Old name of #LinphoneCoreCbsGlobalStateChangedCb.
+ */
+typedef LinphoneCoreCbsGlobalStateChangedCb LinphoneCoreGlobalStateChangedCb;
+
+/**
+ * Call state notification callback.
+ * @param lc the #LinphoneCore
+ * @param call the call object whose state is changed.
+ * @param cstate the new state of the call
+ * @param message a non NULL informational message about the state.
+ */
+typedef void (*LinphoneCoreCbsCallStateChangedCb)(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *message);
+
+/**
+ * Old name of #LinphoneCoreCbsCallStateChangedCb.
+ */
+typedef LinphoneCoreCbsCallStateChangedCb LinphoneCoreCallStateChangedCb;
+
+/**
+ * Call encryption changed callback.
+ * @param lc the #LinphoneCore
+ * @param call the call on which encryption is changed.
+ * @param on whether encryption is activated.
+ * @param authentication_token an authentication_token, currently set for ZRTP kind of encryption only.
+ */
+typedef void (*LinphoneCoreCbsCallEncryptionChangedCb)(LinphoneCore *lc, LinphoneCall *call, bool_t on, const char *authentication_token);
+
+/**
+ * Old name of #LinphoneCoreCbsCallEncryptionChangedCb.
+ */
+typedef LinphoneCoreCbsCallEncryptionChangedCb LinphoneCoreCallEncryptionChangedCb;
+
+/**
+ * Registration state notification callback prototype
+ * @ingroup Proxies
+ */
+typedef void (*LinphoneCoreCbsRegistrationStateChangedCb)(LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState cstate, const char *message);
+
+/**
+ * Old name of #LinphoneCoreCbsRegistrationStateChangedCb.
+ */
+typedef LinphoneCoreCbsRegistrationStateChangedCb LinphoneCoreRegistrationStateChangedCb;
+
+/**
+ * Report status change for a friend previously \link linphone_core_add_friend() added \endlink to #LinphoneCore.
+ * @param lc #LinphoneCore object .
+ * @param lf Updated #LinphoneFriend .
+ */
+typedef void (*LinphoneCoreCbsNotifyPresenceReceivedCb)(LinphoneCore *lc, LinphoneFriend * lf);
+
+/**
+ * Old name of #LinphoneCoreCbsNotifyPresenceReceivedCb.
+ */
+typedef LinphoneCoreCbsNotifyPresenceReceivedCb LinphoneCoreNotifyPresenceReceivedCb;
+
+/**
+ * Reports presence model change for a specific URI or phone number of a friend
+ * @param lc #LinphoneCore object
+ * @param lf #LinphoneFriend object
+ * @param uri_or_tel The URI or phone number for which teh presence model has changed
+ * @param presence_model The new presence model
+ */
+typedef void (*LinphoneCoreCbsNotifyPresenceReceivedForUriOrTelCb)(LinphoneCore *lc, LinphoneFriend *lf, const char *uri_or_tel, const LinphonePresenceModel *presence_model);
+
+/**
+ * Old name of #LinphoneCoreCbsNotifyPresenceReceivedForUriOrTelCb.
+ */
+typedef LinphoneCoreCbsNotifyPresenceReceivedForUriOrTelCb LinphoneCoreNotifyPresenceReceivedForUriOrTelCb;
+
+/**
+ * Reports that a new subscription request has been received and wait for a decision.
+ * Status on this subscription request is notified by \link linphone_friend_set_inc_subscribe_policy() changing policy \endlink for this friend
+ * @param lc #LinphoneCore object
+ * @param lf #LinphoneFriend corresponding to the subscriber
+ * @param url of the subscriber
+ */
+typedef void (*LinphoneCoreCbsNewSubscriptionRequestedCb)(LinphoneCore *lc, LinphoneFriend *lf, const char *url);
+
+/**
+ * Old name of #LinphoneCoreCbsNewSubscriptionRequestedCb.
+ */
+typedef LinphoneCoreCbsNewSubscriptionRequestedCb LinphoneCoreNewSubscriptionRequestedCb;
+
+/**
+ * Callback for requesting authentication information to application or user.
+ * @param lc the #LinphoneCore
+ * @param realm the realm (domain) on which authentication is required.
+ * @param username the username that needs to be authenticated.
+ * @param domain the domain on which authentication is required.
+ * Application shall reply to this callback using linphone_core_add_auth_info().
+ */
+typedef void (*LinphoneCoreAuthInfoRequestedCb)(LinphoneCore *lc, const char *realm, const char *username, const char *domain);
+
+/**
+ * Callback for requesting authentication information to application or user.
+ * @param lc the #LinphoneCore
+ * @param auth_info a #LinphoneAuthInfo pre-filled with username, realm and domain values as much as possible
+ * @param method the type of authentication requested
+ * Application shall reply to this callback using linphone_core_add_auth_info().
+ */
+typedef void (*LinphoneCoreCbsAuthenticationRequestedCb)(LinphoneCore *lc, LinphoneAuthInfo *auth_info, LinphoneAuthMethod method);
+
+/**
+ * Old name of #LinphoneCoreCbsAuthenticationRequestedCb.
+ */
+typedef LinphoneCoreCbsAuthenticationRequestedCb LinphoneCoreAuthenticationRequestedCb;
+
+/**
+ * Callback to notify a new call-log entry has been added.
+ * This is done typically when a call terminates.
+ * @param lc the #LinphoneCore
+ * @param newcl the new call log entry added.
+ */
+typedef void (*LinphoneCoreCbsCallLogUpdatedCb)(LinphoneCore *lc, LinphoneCallLog *newcl);
+
+/**
+ * Old name of #LinphoneCoreCbsCallLogUpdatedCb.
+ */
+typedef LinphoneCoreCbsCallLogUpdatedCb LinphoneCoreCallLogUpdatedCb;
+
+/**
+ * Callback prototype
+ * @param lc #LinphoneCore object
+ * @param room #LinphoneChatRoom involved in this conversation. Can be be created by the framework in case \link #LinphoneAddress the from \endlink is not present in any chat room.
+ * @param from #LinphoneAddress from
+ * @param message incoming message
+ * @deprecated use #LinphoneCoreMessageReceivedCb instead.
+ * @donotwrap
+ */
+typedef void (*LinphoneCoreTextMessageReceivedCb)(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from, const char *message);
+
+/**
+ * Chat message callback prototype
+ * @param lc #LinphoneCore object
+ * @param room #LinphoneChatRoom involved in this conversation. Can be be created by the framework in case \link #LinphoneAddress the from \endlink is not present in any chat room.
+ * @param #LinphoneChatMessage incoming message
+ */
+typedef void (*LinphoneCoreCbsMessageReceivedCb)(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message);
+
+/**
+ * Chat message callback prototype
+ * @param lc #LinphoneCore object
+ * @param room #LinphoneChatRoom involved in this conversation. Can be be created by the framework in case \link #LinphoneAddress the from \endlink is not present in any chat room.
+ * @param #LinphoneChatMessage outgoing message
+ */
+typedef void (*LinphoneCoreCbsMessageSentCb)(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message);
+
+/**
+ * Old name of #LinphoneCoreCbsMessageReceivedCb.
+ */
+typedef LinphoneCoreCbsMessageReceivedCb LinphoneCoreMessageReceivedCb;
+
+/**
+ * Chat room marked as read callback
+ * @param lc #LinphoneCore object
+ * @param room #LinphoneChatRoom that has been marked as read.
+ */
+typedef void (*LinphoneCoreCbsChatRoomReadCb)(LinphoneCore *lc, LinphoneChatRoom *room);
+
+/**
+ * Chat message not decrypted callback prototype
+ * @param lc #LinphoneCore object
+ * @param room #LinphoneChatRoom involved in this conversation. Can be be created by the framework in case \link #LinphoneAddress the from \endlink is not present in any chat room.
+ * @param #LinphoneChatMessage incoming message
+ */
+typedef void (*LinphoneCoreCbsMessageReceivedUnableDecryptCb)(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage *message);
+
+/**
+ * File transfer receive callback prototype. This function is called by the core upon an incoming File transfer is started. This function may be call several time for the same file in case of large file.
+ * @param lc #LinphoneCore object
+ * @param message #LinphoneChatMessage message from which the body is received.
+ * @param content #LinphoneContent incoming content information
+ * @param buff pointer to the received data
+ * @param size number of bytes to be read from buff. 0 means end of file.
+ */
+typedef void (*LinphoneCoreFileTransferRecvCb)(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, const char* buff, size_t size);
+
+/**
+ * File transfer send callback prototype. This function is called by the core upon an outgoing file transfer is started. This function is called until size is set to 0.
+ * @param lc #LinphoneCore object
+ * @param message #LinphoneChatMessage message from which the body is received.
+ * @param content #LinphoneContent outgoing content
+ * @param buff pointer to the buffer where data chunk shall be written by the app
+ * @param size as input value, it represents the number of bytes expected by the framework. As output value, it means the number of bytes wrote by the application in the buffer. 0 means end of file.
+ *
+ */
+typedef void (*LinphoneCoreFileTransferSendCb)(LinphoneCore *lc, LinphoneChatMessage *message,  const LinphoneContent* content, char* buff, size_t* size);
+
+/**
+ * File transfer progress indication callback prototype.
+ * @param lc #LinphoneCore object
+ * @param message #LinphoneChatMessage message from which the body is received.
+ * @param content #LinphoneContent incoming content information
+ * @param offset The number of bytes sent/received since the beginning of the transfer.
+ * @param total The total number of bytes to be sent/received.
+ */
+typedef void (*LinphoneCoreFileTransferProgressIndicationCb)(LinphoneCore *lc, LinphoneChatMessage *message, const LinphoneContent* content, size_t offset, size_t total);
+
+/**
+ * Is composing notification callback prototype.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] room #LinphoneChatRoom involved in the conversation.
+ */
+typedef void (*LinphoneCoreCbsIsComposingReceivedCb)(LinphoneCore *lc, LinphoneChatRoom *room);
+
+/**
+ * Old name of #LinphoneCoreCbsIsComposingReceivedCb.
+ */
+typedef LinphoneCoreCbsIsComposingReceivedCb LinphoneCoreIsComposingReceivedCb;
+
+/**
+ * Callback for being notified of DTMFs received.
+ * @param lc the linphone core
+ * @param call the call that received the dtmf
+ * @param dtmf the ascii code of the dtmf
+ */
+typedef void (*LinphoneCoreCbsDtmfReceivedCb)(LinphoneCore* lc, LinphoneCall *call, int dtmf);
+
+/**
+ * Old name of #LinphoneCoreCbsDtmfReceivedCb.
+ */
+typedef LinphoneCoreCbsDtmfReceivedCb LinphoneCoreDtmfReceivedCb;
+
+/** Callback prototype */
+typedef void (*LinphoneCoreCbsReferReceivedCb)(LinphoneCore *lc, const char *refer_to);
+
+/**
+ * Old name of #LinphoneCoreCbsReferReceivedCb.
+ */
+typedef LinphoneCoreCbsReferReceivedCb LinphoneCoreReferReceivedCb;
+
+/** Callback prototype */
+typedef void (*LinphoneCoreCbsBuddyInfoUpdatedCb)(LinphoneCore *lc, LinphoneFriend *lf);
+
+/**
+ * Old name of #LinphoneCoreCbsBuddyInfoUpdatedCb.
+ */
+typedef LinphoneCoreCbsBuddyInfoUpdatedCb LinphoneCoreBuddyInfoUpdatedCb;
+
+/**
+ * Callback for notifying progresses of transfers.
+ * @param lc the #LinphoneCore
+ * @param transfered the call that was transfered
+ * @param new_call_state the state of the call to transfer target at the far end.
+ */
+typedef void (*LinphoneCoreCbsTransferStateChangedCb)(LinphoneCore *lc, LinphoneCall *transfered, LinphoneCallState new_call_state);
+
+/**
+ * Old name of LinphoneCoreCbsTransferStateChangedCb.
+ */
+typedef LinphoneCoreCbsTransferStateChangedCb LinphoneCoreTransferStateChangedCb;
+
+/**
+ * Callback for receiving quality statistics for calls.
+ * @param lc the #LinphoneCore
+ * @param call the call
+ * @param stats the call statistics.
+ */
+typedef void (*LinphoneCoreCbsCallStatsUpdatedCb)(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallStats *stats);
+
+/**
+ * Old name of #LinphoneCoreCbsCallStatsUpdatedCb.
+ */
+typedef LinphoneCoreCbsCallStatsUpdatedCb LinphoneCoreCallStatsUpdatedCb;
+
+/**
+ * Callback prototype for receiving info messages.
+ * @param lc the #LinphoneCore
+ * @param call the call whose info message belongs to.
+ * @param msg the info message.
+ */
+typedef void (*LinphoneCoreCbsInfoReceivedCb)(LinphoneCore *lc, LinphoneCall *call, const LinphoneInfoMessage *msg);
+
+/**
+ * Old name of #LinphoneCoreCbsInfoReceivedCb.
+ */
+typedef LinphoneCoreCbsInfoReceivedCb LinphoneCoreInfoReceivedCb;
+
+/**
+ * Callback prototype for configuring status changes notification
+ * @param lc the #LinphoneCore
+ * @param message informational message.
+ */
+typedef void (*LinphoneCoreCbsConfiguringStatusCb)(LinphoneCore *lc, LinphoneConfiguringState status, const char *message);
+
+/**
+ * Old name of #LinphoneCoreCbsConfiguringStatusCb.
+ */
+typedef LinphoneCoreCbsConfiguringStatusCb LinphoneCoreConfiguringStatusCb;
+
+/**
+ * Callback prototype for reporting network change either automatically detected or notified by #linphone_core_set_network_reachable.
+ * @param lc the #LinphoneCore
+ * @param reachable true if network is reachable.
+ */
+typedef void (*LinphoneCoreCbsNetworkReachableCb)(LinphoneCore *lc, bool_t reachable);
+
+/**
+ * Old name of #LinphoneCoreCbsNetworkReachableCb.
+ */
+typedef LinphoneCoreCbsNetworkReachableCb LinphoneCoreNetworkReachableCb;
+
+/**
+ * Callback prototype for reporting log collection upload state change.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] state The state of the log collection upload
+ * @param[in] info Additional information: error message in case of error state, URL of uploaded file in case of success.
+ */
+typedef void (*LinphoneCoreCbsLogCollectionUploadStateChangedCb)(LinphoneCore *lc, LinphoneCoreLogCollectionUploadState state, const char *info);
+
+/**
+ * Old name of #LinphoneCoreCbsLogCollectionUploadStateChangedCb.
+ */
+typedef LinphoneCoreCbsLogCollectionUploadStateChangedCb LinphoneCoreLogCollectionUploadStateChangedCb;
+
+/**
+ * Callback prototype for reporting log collection upload progress indication.
+ * @param[in] lc #LinphoneCore object
+ */
+typedef void (*LinphoneCoreCbsLogCollectionUploadProgressIndicationCb)(LinphoneCore *lc, size_t offset, size_t total);
+
+/**
+ * Old name of #LinphoneCoreCbsLogCollectionUploadProgressIndicationCb.
+ */
+typedef LinphoneCoreCbsLogCollectionUploadProgressIndicationCb LinphoneCoreLogCollectionUploadProgressIndicationCb;
+
+/**
+ * Callback prototype for reporting when a friend list has been added to the core friends list.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] list #LinphoneFriendList object
+ */
+typedef void (*LinphoneCoreCbsFriendListCreatedCb) (LinphoneCore *lc, LinphoneFriendList *list);
+
+/**
+ * Old name of #LinphoneCoreCbsFriendListCreatedCb.
+ */
+typedef LinphoneCoreCbsFriendListCreatedCb LinphoneCoreFriendListCreatedCb;
+
+/**
+ * Callback prototype for reporting when a friend list has been removed from the core friends list.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] list #LinphoneFriendList object
+ */
+typedef void (*LinphoneCoreCbsFriendListRemovedCb) (LinphoneCore *lc, LinphoneFriendList *list);
+
+/**
+ * Old name of #LinphoneCoreCbsFriendListRemovedCb.
+ */
+typedef LinphoneCoreCbsFriendListRemovedCb LinphoneCoreFriendListRemovedCb;
+
+/**
+ * Callback prototype for reporting the result of a version update check.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] result The result of the version update check
+ * @param[in] url The url where to download the new version if the result is #LinphoneVersionUpdateCheckNewVersionAvailable
+ */
+typedef void (*LinphoneCoreCbsVersionUpdateCheckResultReceivedCb) (LinphoneCore *lc, LinphoneVersionUpdateCheckResult result, const char *version, const char *url);
+
+/**
+ * Callback prototype telling that a #LinphoneChatRoom state has changed.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] cr The #LinphoneChatRoom object for which the state has changed
+ */
+typedef void (*LinphoneCoreCbsChatRoomStateChangedCb) (LinphoneCore *lc, LinphoneChatRoom *cr, LinphoneChatRoomState state);
+
+/**
+ * Callback prototype telling the result of decoded qrcode
+ * @param[in] lc LinphoneCore object
+ * @param[in] result The result of the decoded qrcode
+ */
+typedef void (*LinphoneCoreCbsQrcodeFoundCb)(LinphoneCore *lc, const char *result);
+
+/**
+ * @}
+**/
+
+/**
+ * @addtogroup event_api
+ * @{
+**/
+
+/**
+ * Callback prototype for notifying the application about notification received from the network.
+**/
+typedef void (*LinphoneCoreCbsNotifyReceivedCb)(LinphoneCore *lc, LinphoneEvent *lev, const char *notified_event, const LinphoneContent *body);
+
+/**
+ * Old name of #LinphoneCoreCbsNotifyReceivedCb.
+ */
+typedef LinphoneCoreCbsNotifyReceivedCb LinphoneCoreNotifyReceivedCb;
+
+/**
+ * Callback prototype for notifying the application about subscription received from the network.
+**/
+typedef void (*LinphoneCoreCbsSubscribeReceivedCb)(LinphoneCore *lc, LinphoneEvent *lev, const char *subscribe_event, const LinphoneContent *body);
+
+/**
+ * Old name of #LinphoneCoreCbsSubscribeReceivedCb.
+ */
+typedef LinphoneCoreCbsSubscribeReceivedCb LinphoneCoreSubscribeReceivedCb;
+
+/**
+ * Callback prototype for notifying the application about changes of subscription states, including arrival of new subscriptions.
+**/
+typedef void (*LinphoneCoreCbsSubscriptionStateChangedCb)(LinphoneCore *lc, LinphoneEvent *lev, LinphoneSubscriptionState state);
+
+/**
+ * Old name of #LinphoneCoreCbsSubscriptionStateChangedCb.
+ */
+typedef LinphoneCoreCbsSubscriptionStateChangedCb LinphoneCoreSubscriptionStateChangedCb;
+
+/**
+ * Callback prototype for notifying the application about changes of publish states.
+**/
+typedef void (*LinphoneCoreCbsPublishStateChangedCb)(LinphoneCore *lc, LinphoneEvent *lev, LinphonePublishState state);
+
+/**
+ * Old name of LinphoneCoreCbsPublishStateChangedCb.
+ */
+typedef LinphoneCoreCbsPublishStateChangedCb LinphoneCorePublishStateChangedCb;
+
+/**
+ * @}
+**/
+
+/**
+ * @addtogroup event_api
+ * @{
+ */
+
+/**
+ * Callback used to notify the response to a sent NOTIFY
+ * @param ev The LinphoneEvent object that has sent the NOTIFY and for which we received a response
+**/
+typedef void (*LinphoneEventCbsNotifyResponseCb)(const LinphoneEvent *ev);
+
+/**
+ * @}
+ */
+
+/**
+ * @addtogroup buddy_list
+ * @{
+ */
+
+/**
+ * Callback used to notify a new contact has been created on the CardDAV server and downloaded locally
+ * @param list The #LinphoneFriendList object the new contact is added to
+ * @param lf The #LinphoneFriend object that has been created
+**/
+typedef void (*LinphoneFriendListCbsContactCreatedCb)(LinphoneFriendList *list, LinphoneFriend *lf);
+
+/**
+ * Callback used to notify a contact has been deleted on the CardDAV server
+ * @param list The #LinphoneFriendList object a contact has been removed from
+ * @param lf The #LinphoneFriend object that has been deleted
+**/
+typedef void (*LinphoneFriendListCbsContactDeletedCb)(LinphoneFriendList *list, LinphoneFriend *lf);
+
+/**
+ * Callback used to notify a contact has been updated on the CardDAV server
+ * @param list The #LinphoneFriendList object in which a contact has been updated
+ * @param new_friend The new #LinphoneFriend object corresponding to the updated contact
+ * @param old_friend The old #LinphoneFriend object before update
+**/
+typedef void (*LinphoneFriendListCbsContactUpdatedCb)(LinphoneFriendList *list, LinphoneFriend *new_friend, LinphoneFriend *old_friend);
+
+/**
+ * Callback used to notify the status of the synchronization has changed
+ * @param list The #LinphoneFriendList object for which the status has changed
+ * @param status The new synchronisation status
+ * @param msg An additional information on the status update
+**/
+typedef void (*LinphoneFriendListCbsSyncStateChangedCb)(LinphoneFriendList *list, LinphoneFriendListSyncStatus status, const char *msg);
+
+/**
+ * Callback used to notify a list with all friends that have received presence information.
+ * @param list The #LinphoneFriendList object for which the status has changed
+ * @param friends A \bctbx_list{LinphoneFriend} of the relevant friends
+**/
+typedef void (*LinphoneFriendListCbsPresenceReceivedCb)(LinphoneFriendList *list, const bctbx_list_t *friends);
+
+/**
+ * @}
+**/
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * @brief Function prototype used by #linphone_core_cbs_set_ec_calibrator_result().
+ * @param lc The core.
+ * @param status The state of the calibrator.
+ * @param delay_ms The measured delay if available.
+ */
+typedef void (*LinphoneCoreCbsEcCalibrationResultCb)(LinphoneCore *lc, LinphoneEcCalibratorStatus status, int delay_ms);
+
+/**
+ * @brief Function prototype used by #linphone_core_cbs_set_ec_calibrator_audio_init().
+ * @param lc The core.
+ */
+typedef void (*LinphoneCoreCbsEcCalibrationAudioInitCb)(LinphoneCore *lc);
+
+/**
+ * @brief Function prototype used by #linphone_core_cbs_set_ec_calibrator_audio_uninit().
+ * @param lc The core.
+ */
+typedef void (*LinphoneCoreCbsEcCalibrationAudioUninitCb)(LinphoneCore *lc);
+
+/**
+ * Callback to decrypt incoming #LinphoneChatMessage
+ * @param engine ImEncryptionEngine object
+ * @param room #LinphoneChatRoom object
+ * @param msg #LinphoneChatMessage object
+ * @return -1 if nothing to be done, 0 on success or an integer > 0 for error
+*/
+typedef int (*LinphoneImEncryptionEngineCbsIncomingMessageCb)(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+
+/**
+ * Callback to encrypt outgoing #LinphoneChatMessage
+ * @param engine #LinphoneImEncryptionEngine object
+ * @param room #LinphoneChatRoom object
+ * @param msg #LinphoneChatMessage object
+ * @return -1 if nothing to be done, 0 on success or an integer > 0 for error
+*/
+typedef int (*LinphoneImEncryptionEngineCbsOutgoingMessageCb)(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+
+/**
+ * Callback to know whether or not the engine will encrypt files before uploading them
+ * @param engine #LinphoneImEncryptionEngine object
+ * @param room #LinphoneChatRoom object
+ * @return TRUE if files will be encrypted, FALSE otherwise
+*/
+typedef bool_t (*LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb)(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room);
+
+/**
+ * Callback to generate the key used to encrypt the files before uploading them
+ * Key can be stored in the #LinphoneContent object inside the #LinphoneChatMessage using linphone_content_set_key
+ * @param engine #LinphoneImEncryptionEngine object
+ * @param room #LinphoneChatRoom object
+ * @param msg #LinphoneChatMessage object
+*/
+typedef void (*LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb)(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg);
+
+/**
+ * Callback to decrypt downloading file
+ * @param engine #LinphoneImEncryptionEngine object
+ * @param msg #LinphoneChatMessage object
+ * @param offset The current offset of the upload
+ * @param[in] buffer Encrypted data buffer
+ * @param[in] size Size of the encrypted data buffer and maximum size of the decrypted data buffer
+ * @param[out] decrypted_buffer Buffer in which to write the decrypted data which maximum size is size
+ * @return -1 if nothing to be done, 0 on success or an integer > 0 for error
+*/
+typedef int (*LinphoneImEncryptionEngineCbsDownloadingFileCb)(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, size_t offset, const uint8_t *buffer, size_t size, uint8_t *decrypted_buffer);
+
+/**
+ * Callback to encrypt uploading file
+ * @param engine #LinphoneImEncryptionEngine object
+ * @param msg #LinphoneChatMessage object
+ * @param offset The current offset of the upload
+ * @param[in] buffer Encrypted data buffer
+ * @param[in,out] size Size of the plain data buffer and the size of the encrypted data buffer once encryption is done
+ * @param[out] encrypted_buffer Buffer in which to write the encrypted data which maxmimum size is size
+ * @return -1 if nothing to be done, 0 on success or an integer > 0 for error
+*/
+typedef int (*LinphoneImEncryptionEngineCbsUploadingFileCb)(LinphoneImEncryptionEngine *engine, LinphoneChatMessage *msg, size_t offset, const uint8_t *buffer, size_t *size, uint8_t *encrypted_buffer);
+
+/**
+ * Callback used to notify the response to an XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object
+**/
+typedef void (*LinphoneXmlRpcRequestCbsResponseCb)(LinphoneXmlRpcRequest *request);
+
+/**
+ * @}
+**/
+
+/**
+ * @addtogroup call_control
+ * @{
+ */
+
+/**
+ * Callback for notifying end of play (file).
+ * @param[in] player The #LinphonePlayer object
+**/
+typedef void (*LinphonePlayerCbsEofReachedCb)(LinphonePlayer *obj);
+
+
+/**
+ * @}
+**/
+
+#endif /* LINPHONE_CALLBACKS_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/chat.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/chat.h"
new file mode 100644
index 0000000..15805ef
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/chat.h"
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_CHAT_H_
+#define LINPHONE_CHAT_H_
+
+
+#include "linphone/callbacks.h"
+#include "linphone/types.h"
+#include "linphone/api/c-types.h"
+#include "linphone/api/c-chat-message.h"
+#include "linphone/api/c-chat-message-cbs.h"
+#include "linphone/api/c-chat-room-params.h"
+#include "linphone/api/c-chat-room.h"
+#include "linphone/api/c-chat-room-cbs.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+/**
+ * Returns an list of chat rooms
+ * @param[in] lc #LinphoneCore object
+ * @return \bctbx_list{LinphoneChatRoom}
+**/
+LINPHONE_PUBLIC const bctbx_list_t* linphone_core_get_chat_rooms(LinphoneCore *lc);
+
+/**
+ * Creates and returns the default chat room parameters.
+ * @param[in] lc #LinphoneCore object
+ * @return LinphoneChatRoomParams
+**/
+LINPHONE_PUBLIC LinphoneChatRoomParams *linphone_core_create_default_chat_room_params(LinphoneCore *lc);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* LINPHONE_CHAT_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/conference.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/conference.h"
new file mode 100644
index 0000000..e8b3b60
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/conference.h"
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef LINPHONE_CONFERENCE_H
+#define LINPHONE_CONFERENCE_H
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup call_control
+ * @{
+ */
+
+/**
+ * Create a #LinphoneConferenceParams with default parameters set.
+ * @param core #LinphoneCore to use to find out the default parameters. Can be NULL.
+ * @return A freshly allocated #LinphoneConferenceParams
+ */
+LINPHONE_PUBLIC LinphoneConferenceParams *linphone_conference_params_new(const LinphoneCore *core);
+
+/**
+ * Take a reference on a #LinphoneConferencParams.
+ * @param[in] params The #LinphoneConferenceParams to ref.
+ * @return The freshly refed #LinphoneConferenceParams.
+ */
+LINPHONE_PUBLIC LinphoneConferenceParams *linphone_conference_params_ref(LinphoneConferenceParams *params);
+
+/**
+ * Release a #LinphoneConferenceParams.
+ * @param[in] params The #LinphoneConferenceParams to release.
+ */
+LINPHONE_PUBLIC void linphone_conference_params_unref(LinphoneConferenceParams *params);
+
+/**
+ * Free a #LinphoneConferenceParams
+ * @param params #LinphoneConferenceParams to free
+ * @deprecated Use linphone_conference_params_unref() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_conference_params_free(LinphoneConferenceParams *params);
+
+/**
+ * Clone a #LinphoneConferenceParams
+ * @param params The #LinphoneConferenceParams to clone
+ * @return An allocated #LinphoneConferenceParams with the same parameters than params
+ */
+LINPHONE_PUBLIC LinphoneConferenceParams *linphone_conference_params_clone(const LinphoneConferenceParams *params);
+
+/**
+ * Enable video when starting a conference
+ * @param params A #LinphoneConferenceParams
+ * @param enable If true, video will be enabled during conference
+ */
+LINPHONE_PUBLIC void linphone_conference_params_enable_video(LinphoneConferenceParams *params, bool_t enable);
+
+/**
+ * Check whether video will be enable at conference starting
+ * @return if true, the video will be enable at conference starting
+ */
+LINPHONE_PUBLIC bool_t linphone_conference_params_video_requested(const LinphoneConferenceParams *params);
+
+
+/**
+ * Take a reference on a #LinphoneConference.
+ * @param[in] conf The #LinphoneConference to ref.
+ * @return The freshly refed #LinphoneConference.
+ */
+LINPHONE_PUBLIC LinphoneConference *linphone_conference_ref(LinphoneConference *conf);
+
+/**
+ * Release a #LinphoneConference.
+ * @param[in] conf The #LinphoneConference to release.
+ */
+LINPHONE_PUBLIC void linphone_conference_unref(LinphoneConference *conf);
+
+/**
+ * Remove a participant from a conference
+ * @param obj A #LinphoneConference
+ * @param uri SIP URI of the participant to remove
+ * @warning The passed SIP URI must be one of the URIs returned by linphone_conference_get_participants()
+ * @return 0 if succeeded, -1 if failed
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_conference_remove_participant(LinphoneConference *obj, const LinphoneAddress *uri);
+
+/**
+ * Get URIs of all participants of one conference
+ * The returned bctbx_list_t contains URIs of all participant. That list must be
+ * freed after use and each URI must be unref with linphone_address_unref()
+ * @param obj A #LinphoneConference
+ * @return \bctbx_list{LinphoneAddress}
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_conference_get_participants(const LinphoneConference *obj);
+
+/**
+ * Invite participants to the conference, by supplying a list of #LinphoneAddress
+ * @param obj The conference.
+ * @param addresses \bctbx_list{LinphoneAddress}
+ * @param params #LinphoneCallParams to use for inviting the participants.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_conference_invite_participants(LinphoneConference *conf, const bctbx_list_t *addresses, const LinphoneCallParams *params);
+
+/**
+  * Get the conference id as string
+  */
+LINPHONE_PUBLIC const char *linphone_conference_get_ID(const LinphoneConference *obj);
+
+/**
+  * Set the conference id as string
+  */
+LINPHONE_PUBLIC void linphone_conference_set_ID(const LinphoneConference *obj, const char *conferenceID);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // LINPHONE_CONFERENCE_H
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/contactprovider.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/contactprovider.h"
new file mode 100644
index 0000000..b247506
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/contactprovider.h"
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_CONTACTPROVIDER_H_
+#define LINPHONE_CONTACTPROVIDER_H_
+
+
+#include "linphone/core.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LinphoneContactSearchRequest */
+
+void linphone_contact_search_init(LinphoneContactSearch *obj, const char *predicate, ContactSearchCallback cb, void *cb_data);
+LinphoneContactSearchID linphone_contact_search_get_id(LinphoneContactSearch *obj);
+const char* linphone_contact_search_get_predicate(LinphoneContactSearch *obj);
+void linphone_contact_search_invoke_cb(LinphoneContactSearch *req, MSList *friends);
+LINPHONE_PUBLIC LinphoneContactSearch* linphone_contact_search_ref(void *obj);
+void linphone_contact_search_unref(void *obj);
+LinphoneContactSearch* linphone_contact_search_cast(void *obj);
+
+
+/* LinphoneContactProvider */
+
+void linphone_contact_provider_init(LinphoneContactProvider *obj, LinphoneCore *lc);
+LinphoneCore * linphone_contact_provider_get_core(LinphoneContactProvider *obj);
+const char * linphone_contact_provider_get_name(LinphoneContactProvider *obj);
+LinphoneContactProvider* linphone_contact_provider_ref(void *obj);
+LINPHONE_PUBLIC void linphone_contact_provider_unref(void *obj);
+LINPHONE_PUBLIC LinphoneContactProvider * linphone_contact_provider_cast(void *obj);
+
+LINPHONE_PUBLIC LinphoneContactSearch * linphone_contact_provider_begin_search(LinphoneContactProvider *obj, const char *predicate, ContactSearchCallback cb, void *data);
+unsigned int linphone_contact_provider_cancel_search(LinphoneContactProvider *obj, LinphoneContactSearch *request);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* LINPHONE_CONTACTPROVIDER_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/core.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/core.h"
new file mode 100644
index 0000000..7ffc612
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/core.h"
@@ -0,0 +1,6052 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONECORE_H
+#define LINPHONECORE_H
+
+#include "ortp/ortp.h"
+#include "ortp/payloadtype.h"
+#include "mediastreamer2/mscommon.h"
+#include "mediastreamer2/msvideo.h"
+#include "mediastreamer2/mediastream.h"
+#include "mediastreamer2/bitratecontrol.h"
+
+#include "linphone/defs.h"
+#include "linphone/types.h"
+#include "linphone/callbacks.h"
+#include "linphone/sipsetup.h"
+
+#include "linphone/account_creator.h"
+#include "linphone/account_creator_service.h"
+
+#include "linphone/buffer.h"
+#include "linphone/call.h"
+#include "linphone/call_log.h"
+#include "linphone/call_params.h"
+#include "linphone/call_stats.h"
+#include "linphone/chat.h"
+#include "linphone/conference.h"
+#include "linphone/dictionary.h"
+#include "linphone/error_info.h"
+#include "linphone/event.h"
+#include "linphone/factory.h"
+#include "linphone/friend.h"
+#include "linphone/friendlist.h"
+#include "linphone/im_encryption_engine.h"
+#include "linphone/im_notif_policy.h"
+#include "linphone/info_message.h"
+#include "linphone/logging.h"
+#include "linphone/lpconfig.h"
+#include "linphone/misc.h"
+#include "linphone/nat_policy.h"
+#include "linphone/payload_type.h"
+#include "linphone/player.h"
+#include "linphone/presence.h"
+#include "linphone/proxy_config.h"
+#include "linphone/ringtoneplayer.h"
+#include "linphone/vcard.h"
+#include "linphone/video_definition.h"
+#include "linphone/xmlrpc.h"
+#include "linphone/headers.h"
+
+// For migration purpose.
+#include "linphone/api/c-api.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Safely down-cast a belle_sip_object_t into #LinphoneCore
+ * @ingroup initializing
+ */
+#define LINPHONE_CORE(object) BELLE_SIP_CAST(object, LinphoneCore)
+
+
+/**
+ * Create a #LinphoneAddress object by parsing the user supplied address, given as a string.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] address String containing the user supplied address
+ * @return The create #LinphoneAddress object
+ * @ingroup linphone_address
+ */
+LINPHONE_PUBLIC LinphoneAddress * linphone_core_create_address(LinphoneCore *lc, const char *address);
+
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Create an independent media file player.
+ * This player support WAVE and MATROSKA formats.
+ * @param lc A #LinphoneCore object
+ * @param sound_card_name Playback sound card. If NULL, the ringer sound card set in #LinphoneCore will be used
+ * @param video_display_name Video display. If NULL, the video display set in #LinphoneCore will be used
+ * @param window_id Id of the drawing window. Depend of video out
+ * @return A pointer on the new instance. NULL if faild.
+ */
+LINPHONE_PUBLIC LinphonePlayer *linphone_core_create_local_player(LinphoneCore *lc, const char *sound_card_name, const char *video_display_name, void *window_id);
+
+/**
+ * Creates an empty info message.
+ * @param lc the #LinphoneCore
+ * @return a new LinphoneInfoMessage.
+ *
+ * The info message can later be filled with information using linphone_info_message_add_header() or linphone_info_message_set_content(),
+ * and finally sent with linphone_core_send_info_message().
+**/
+LINPHONE_PUBLIC LinphoneInfoMessage *linphone_core_create_info_message(LinphoneCore*lc);
+
+/**
+ * Create a #LinphoneMagicSearch object.
+ * @param[in] lc #LinphoneCore object
+ * @return The create #LinphoneMagicSearch object
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC LinphoneMagicSearch *linphone_core_create_magic_search(LinphoneCore *lc);
+
+/**
+ * Checks if a new version of the application is available.
+ * @param lc #LinphoneCore object
+ * @param current_version The current version of the application
+ */
+LINPHONE_PUBLIC void linphone_core_check_for_update(LinphoneCore *lc, const char *current_version);
+
+/**
+ * Return the global unread chat message count.
+ * @param[in] lc #LinphoneCore object.
+ * @return The global unread chat message count.
+ */
+LINPHONE_PUBLIC int linphone_core_get_unread_chat_message_count (const LinphoneCore *lc);
+
+/**
+ * Return the unread chat message count for a given local address.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] address #LinphoneAddress object.
+ * @return The unread chat message count.
+ */
+LINPHONE_PUBLIC int linphone_core_get_unread_chat_message_count_from_local (
+	const LinphoneCore *lc,
+	const LinphoneAddress *address
+);
+
+/**
+ * Return the unread chat message count for all active local address. (Primary contact + proxy configs.)
+ * @param[in] lc #LinphoneCore object.
+ * @return The unread chat message count.
+ */
+LINPHONE_PUBLIC int linphone_core_get_unread_chat_message_count_from_active_locals (const LinphoneCore *lc);
+
+/**
+ * @}
+ */
+
+/**
+ * Get the remote address of the current call.
+ * @param[in] lc #LinphoneCore object.
+ * @return The remote address of the current call or NULL if there is no current call.
+ * @ingroup call_control
+ */
+LINPHONE_PUBLIC const LinphoneAddress * linphone_core_get_current_call_remote_address(LinphoneCore *lc);
+
+
+/**
+ * @addtogroup initializing
+ * @{
+**/
+
+/**
+ * Callback prototype
+ */
+typedef void (*LinphoneCoreCbFunc)(LinphoneCore *lc,void * user_data);
+
+/**
+ * This structure holds all callbacks that the application should implement.
+ * None is mandatory.
+ * @donotwrap
+**/
+typedef struct _LinphoneCoreVTable{
+	LinphoneCoreGlobalStateChangedCb global_state_changed; /**<Notifies global state changes*/
+	LinphoneCoreRegistrationStateChangedCb registration_state_changed;/**<Notifies registration state changes*/
+	LinphoneCoreCallStateChangedCb call_state_changed;/**<Notifies call state changes*/
+	LinphoneCoreNotifyPresenceReceivedCb notify_presence_received; /**< Notify received presence events*/
+	LinphoneCoreNotifyPresenceReceivedForUriOrTelCb notify_presence_received_for_uri_or_tel; /**< Notify received presence events*/
+	LinphoneCoreNewSubscriptionRequestedCb new_subscription_requested; /**< Notify about pending presence subscription request */
+	LINPHONE_DEPRECATED LinphoneCoreAuthInfoRequestedCb auth_info_requested; /** @brief Ask the application some authentication information.
+	                                                                             @deprecated Use authentication_requested instead. Deprecated since 2016-09-21 */
+	LinphoneCoreAuthenticationRequestedCb authentication_requested; /**< Ask the application some authentication information */
+	LinphoneCoreCallLogUpdatedCb call_log_updated; /**< Notifies that call log list has been updated */
+	LinphoneCoreMessageReceivedCb message_received; /**< a message is received, can be text or external body*/
+	LinphoneCoreCbsMessageReceivedUnableDecryptCb message_received_unable_decrypt; /**< an encrypted message is received but we can't decrypt it*/
+	LinphoneCoreIsComposingReceivedCb is_composing_received; /**< An is-composing notification has been received */
+	LinphoneCoreDtmfReceivedCb dtmf_received; /**< A dtmf has been received received */
+	LinphoneCoreReferReceivedCb refer_received; /**< An out of call refer was received */
+	LinphoneCoreCallEncryptionChangedCb call_encryption_changed; /**<Notifies on change in the encryption of call streams */
+	LinphoneCoreTransferStateChangedCb transfer_state_changed; /**<Notifies when a transfer is in progress */
+	LinphoneCoreBuddyInfoUpdatedCb buddy_info_updated; /**< a LinphoneFriend's BuddyInfo has changed*/
+	LinphoneCoreCallStatsUpdatedCb call_stats_updated; /**<Notifies on refreshing of call's statistics. */
+	LinphoneCoreInfoReceivedCb info_received; /**<Notifies an incoming informational message received.*/
+	LinphoneCoreSubscriptionStateChangedCb subscription_state_changed; /**<Notifies subscription state change */
+	LinphoneCoreNotifyReceivedCb notify_received; /**< Notifies a an event notification, see linphone_core_subscribe() */
+	LinphoneCoreSubscribeReceivedCb subscribe_received; /**< Notifies a subscribe has been received, see linphone_core_subscribe() */
+	LinphoneCorePublishStateChangedCb publish_state_changed;/**Notifies publish state change (only from #LinphoneEvent api)*/
+	LinphoneCoreConfiguringStatusCb configuring_status; /** Notifies configuring status changes */
+	LINPHONE_DEPRECATED LinphoneCoreTextMessageReceivedCb text_received; /**< @brief A text message has been received.
+	                                                                          @deprecated Use #message_received instead. Deprecated since 2015-11-19.  */
+	LINPHONE_DEPRECATED LinphoneCoreFileTransferRecvCb file_transfer_recv; /**< @brief Callback to store file received attached to a #LinphoneChatMessage.
+	                                                                            @deprecated Deprecated since 2015-11-19. */
+	LINPHONE_DEPRECATED LinphoneCoreFileTransferSendCb file_transfer_send; /**< @brief Callback to collect file chunk to be sent for a #LinphoneChatMessage.
+	                                                                            @deprecated Deprecated since 2015-11-19. */
+	LINPHONE_DEPRECATED LinphoneCoreFileTransferProgressIndicationCb file_transfer_progress_indication; /**< @brief Callback to indicate file transfer progress.
+	                                                                                                         @deprecated Deprecated since 2015-11-19. */
+	LinphoneCoreNetworkReachableCb network_reachable; /**< Callback to report IP network status (I.E up/down )*/
+	LinphoneCoreLogCollectionUploadStateChangedCb log_collection_upload_state_changed; /**< Callback to upload collected logs */
+	LinphoneCoreLogCollectionUploadProgressIndicationCb log_collection_upload_progress_indication; /**< Callback to indicate log collection upload progress */
+	LinphoneCoreFriendListCreatedCb friend_list_created;
+	LinphoneCoreFriendListRemovedCb friend_list_removed;
+	LinphoneCoreCbsCallCreatedCb call_created;
+	LinphoneCoreCbsVersionUpdateCheckResultReceivedCb version_update_check_result_received;
+	LinphoneCoreCbsChatRoomStateChangedCb chat_room_state_changed;
+	LinphoneCoreCbsQrcodeFoundCb qrcode_found;
+	LinphoneCoreCbsEcCalibrationResultCb ec_calibration_result;
+	LinphoneCoreCbsEcCalibrationAudioInitCb ec_calibration_audio_init;
+	LinphoneCoreCbsEcCalibrationAudioUninitCb ec_calibration_audio_uninit;
+	LinphoneCoreCbsMessageReceivedCb message_sent;
+	LinphoneCoreCbsChatRoomReadCb chat_room_read;
+	void *user_data; /**<User data associated with the above callbacks */
+} LinphoneCoreVTable;
+
+/**
+ * @brief Instantiate a vtable with all arguments set to NULL.
+ * @return newly allocated vtable.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LinphoneCoreVTable *linphone_core_v_table_new(void);
+
+/**
+ * @brief Sets a user data pointer in the vtable.
+ * @param table the vtable.
+ * @param data the user data to attach.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void linphone_core_v_table_set_user_data(LinphoneCoreVTable *table, void *data);
+
+/**
+ * @brief Gets a user data pointer in the vtable.
+ * @param table the vtable.
+ * @return the data attached to the vtable.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void* linphone_core_v_table_get_user_data(const LinphoneCoreVTable *table);
+
+/**
+ * Gets the current VTable.
+ * This is meant only to be called from a callback to be able to get the user_data associated with the vtable that called the callback.
+ * @param lc the linphonecore
+ * @return the vtable that called the last callback
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LinphoneCoreVTable *linphone_core_get_current_vtable(LinphoneCore *lc);
+
+/**
+ * @brief Destroy a vtable.
+ * @param table to be destroyed.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void linphone_core_v_table_destroy(LinphoneCoreVTable* table);
+
+/**
+ * Increment the reference counter.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbs *linphone_core_cbs_ref(LinphoneCoreCbs *cbs);
+
+/**
+ * Decrement the reference counter.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_unref(LinphoneCoreCbs *cbs);
+
+/**
+ * Set private data to be get from each callbacks.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_user_data(LinphoneCoreCbs *cbs, void *user_data);
+
+/**
+ * Get the user pointer.
+ */
+LINPHONE_PUBLIC void *linphone_core_cbs_get_user_data(const LinphoneCoreCbs *cbs);
+
+/**
+ * Gets the current #LinphoneCoreCbs.
+ * This is meant only to be called from a callback to be able to get the user_data associated with the #LinphoneCoreCbs that is calling the callback.
+ * @param lc the linphonecore
+ * @return the #LinphoneCoreCbs that has called the last callback
+ */
+LINPHONE_PUBLIC LinphoneCoreCbs *linphone_core_get_current_callbacks(const LinphoneCore *lc);
+
+/**
+ * Set the #LinphoneCoreGlobalStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_global_state_changed(LinphoneCoreCbs *cbs, LinphoneCoreCbsGlobalStateChangedCb cb);
+
+/**
+ * Get the # callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsGlobalStateChangedCb linphone_core_cbs_get_global_state_changed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsRegistrationStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_registration_state_changed(LinphoneCoreCbs *cbs, LinphoneCoreCbsRegistrationStateChangedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsRegistrationStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsRegistrationStateChangedCb linphone_core_cbs_get_registration_state_changed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsCallStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_call_state_changed(LinphoneCoreCbs *cbs, LinphoneCoreCbsCallStateChangedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsCallStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsCallStateChangedCb linphone_core_cbs_get_call_state_changed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsNotifyPresenceReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_notify_presence_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsNotifyPresenceReceivedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsNotifyPresenceReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsNotifyPresenceReceivedCb linphone_core_cbs_get_notify_presence_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsNotifyPresenceReceivedForUriOrTelCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_notify_presence_received_for_uri_or_tel(LinphoneCoreCbs *cbs, LinphoneCoreCbsNotifyPresenceReceivedForUriOrTelCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsNotifyPresenceReceivedForUriOrTelCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsNotifyPresenceReceivedForUriOrTelCb linphone_core_cbs_get_notify_presence_received_for_uri_or_tel(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsNewSubscriptionRequestedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_new_subscription_requested(LinphoneCoreCbs *cbs, LinphoneCoreCbsNewSubscriptionRequestedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsNewSubscriptionRequestedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsNewSubscriptionRequestedCb linphone_core_cbs_get_new_subscription_requested(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsAuthenticationRequestedCb callback.'
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_authentication_requested(LinphoneCoreCbs *cbs, LinphoneCoreCbsAuthenticationRequestedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsAuthenticationRequestedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsAuthenticationRequestedCb linphone_core_cbs_get_authentication_requested(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsCallLogUpdatedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_call_log_updated(LinphoneCoreCbs *cbs, LinphoneCoreCbsCallLogUpdatedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsCallLogUpdatedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsCallLogUpdatedCb linphone_core_cbs_get_call_log_updated(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsMessageReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_message_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsMessageReceivedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsMessageReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsMessageReceivedCb linphone_core_cbs_get_message_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsMessageSentCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_message_sent(LinphoneCoreCbs *cbs, LinphoneCoreCbsMessageSentCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsMessageSentCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsMessageSentCb linphone_core_cbs_get_message_sent(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsChatRoomReadCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_chat_room_read(LinphoneCoreCbs *cbs, LinphoneCoreCbsChatRoomReadCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsChatRoomReadCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsChatRoomReadCb linphone_core_cbs_get_chat_room_read(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsMessageReceivedUnableDecryptCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_message_received_unable_decrypt(LinphoneCoreCbs *cbs, LinphoneCoreCbsMessageReceivedUnableDecryptCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsMessageReceivedUnableDecryptCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsMessageReceivedUnableDecryptCb linphone_core_cbs_get_message_received_unable_decrypt(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsIsComposingReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_is_composing_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsIsComposingReceivedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsIsComposingReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsIsComposingReceivedCb linphone_core_cbs_get_is_composing_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsDtmfReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_dtmf_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsDtmfReceivedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsDtmfReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsDtmfReceivedCb linphone_core_cbs_get_dtmf_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsReferReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_refer_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsReferReceivedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsReferReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsReferReceivedCb linphone_core_cbs_get_refer_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsCallEncryptionChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_call_encryption_changed(LinphoneCoreCbs *cbs, LinphoneCoreCbsCallEncryptionChangedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsCallEncryptionChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsCallEncryptionChangedCb linphone_core_cbs_get_call_encryption_changed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsTransferStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_transfer_state_changed(LinphoneCoreCbs *cbs, LinphoneCoreCbsTransferStateChangedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsTransferStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsTransferStateChangedCb linphone_core_cbs_get_transfer_state_changed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsBuddyInfoUpdatedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_buddy_info_updated(LinphoneCoreCbs *cbs, LinphoneCoreCbsBuddyInfoUpdatedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsBuddyInfoUpdatedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsBuddyInfoUpdatedCb linphone_core_cbs_get_buddy_info_updated(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsCallStatsUpdatedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_call_stats_updated(LinphoneCoreCbs *cbs, LinphoneCoreCbsCallStatsUpdatedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsCallStatsUpdatedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsCallStatsUpdatedCb linphone_core_cbs_get_call_stats_updated(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsInfoReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_info_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsInfoReceivedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsInfoReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsInfoReceivedCb linphone_core_cbs_get_info_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsSubscriptionStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_subscription_state_changed(LinphoneCoreCbs *cbs, LinphoneCoreCbsSubscriptionStateChangedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsSubscriptionStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsSubscriptionStateChangedCb linphone_core_cbs_get_subscription_state_changed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsNotifyReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_notify_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsNotifyReceivedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsNotifyReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsNotifyReceivedCb linphone_core_cbs_get_notify_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsSubscribeReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_subscribe_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsSubscribeReceivedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsSubscribeReceivedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsSubscribeReceivedCb linphone_core_cbs_get_subscribe_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsPublishStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_publish_state_changed(LinphoneCoreCbs *cbs, LinphoneCoreCbsPublishStateChangedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsPublishStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsPublishStateChangedCb linphone_core_cbs_get_publish_state_changed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsConfiguringStatusCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_configuring_status(LinphoneCoreCbs *cbs, LinphoneCoreCbsConfiguringStatusCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsConfiguringStatusCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsConfiguringStatusCb linphone_core_cbs_get_configuring_status(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsNetworkReachableCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_network_reachable(LinphoneCoreCbs *cbs, LinphoneCoreCbsNetworkReachableCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsNetworkReachableCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsNetworkReachableCb linphone_core_cbs_get_network_reachable(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsLogCollectionUploadStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_log_collection_upload_state_changed(LinphoneCoreCbs *cbs, LinphoneCoreCbsLogCollectionUploadStateChangedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsLogCollectionUploadStateChangedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsLogCollectionUploadStateChangedCb linphone_core_cbs_get_log_collection_upload_state_changed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsLogCollectionUploadProgressIndicationCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_log_collection_upload_progress_indication(LinphoneCoreCbs *cbs, LinphoneCoreCbsLogCollectionUploadProgressIndicationCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsLogCollectionUploadProgressIndicationCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsLogCollectionUploadProgressIndicationCb linphone_core_cbs_get_log_collection_upload_progress_indication(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsFriendListCreatedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_friend_list_created(LinphoneCoreCbs *cbs, LinphoneCoreCbsFriendListCreatedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsFriendListCreatedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsFriendListCreatedCb linphone_core_cbs_get_friend_list_created(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the #LinphoneCoreCbsFriendListRemovedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @param[in] cb The callback.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_friend_list_removed(LinphoneCoreCbs *cbs, LinphoneCoreCbsFriendListRemovedCb cb);
+
+/**
+ * Get the #LinphoneCoreCbsFriendListRemovedCb callback.
+ * @param[in] cbs A #LinphoneCoreCbs.
+ * @return The callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsFriendListRemovedCb linphone_core_cbs_get_friend_list_removed(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the call created callback.
+ * @param[in] cbs #LinphoneCallCbs object.
+ * @param[in] cb The call created callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_call_created(LinphoneCoreCbs *cbs, LinphoneCoreCbsCallCreatedCb cb);
+
+/**
+ * Get the call created callback.
+ * @param[in] cbs #LinphoneCoreCbs object.
+ * @return The current call created callback.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsCallCreatedCb linphone_core_cbs_get_call_created(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the version update check result callback.
+ * @param[in] cbs #LinphoneCoreCbs object
+ * @param[in] cb The callback to use
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_version_update_check_result_received(LinphoneCoreCbs *cbs, LinphoneCoreCbsVersionUpdateCheckResultReceivedCb cb);
+
+/**
+ * Get the version update check result callback.
+ * @param[in] cbs #LinphoneCoreCbs object
+ * @return The current callback
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsVersionUpdateCheckResultReceivedCb linphone_core_cbs_get_version_update_check_result_received(LinphoneCoreCbs *cbs);
+
+/**
+ * Get the chat room state changed callback.
+ * @param[in] cbs #LinphoneCoreCbs object
+ * @return The current callback
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsChatRoomStateChangedCb linphone_core_cbs_get_chat_room_state_changed (LinphoneCoreCbs *cbs);
+
+/**
+ * Set the chat room state changed callback.
+ * @param[in] cbs #LinphoneCoreCbs object
+ * @param[in] cb The callback to use
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_chat_room_state_changed (LinphoneCoreCbs *cbs, LinphoneCoreCbsChatRoomStateChangedCb cb);
+
+/**
+ * Get the qrcode found callback.
+ * @param[in] cbs LinphoneCoreCbs object
+ * @return The current callback
+ */
+LINPHONE_PUBLIC LinphoneCoreCbsQrcodeFoundCb linphone_core_cbs_get_qrcode_found(LinphoneCoreCbs *cbs);
+
+/**
+ * Set the qrcode found callback.
+ * @param[in] cbs LinphoneCoreCbs object
+ * @param[in] cb The callback to use
+ **/
+LINPHONE_PUBLIC void linphone_core_cbs_set_qrcode_found(LinphoneCoreCbs *cbs, LinphoneCoreCbsQrcodeFoundCb cb);
+
+/**
+ * @brief Sets a callback to call each time the echo-canceler calibration is completed.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_ec_calibration_result(LinphoneCoreCbs *cbs, LinphoneCoreCbsEcCalibrationResultCb cb);
+
+/**
+ * @brief Sets a callback to call when the echo-canceler calibrator has completed its audio graph.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_ec_calibration_audio_init(LinphoneCoreCbs *cbs, LinphoneCoreCbsEcCalibrationAudioInitCb cb);
+
+/**
+ * @brief Sets a callback to call when the echo-canceler calibrator destroys its audio graph.
+ */
+LINPHONE_PUBLIC void linphone_core_cbs_set_ec_calibration_audio_uninit(LinphoneCoreCbs *cbs, LinphoneCoreCbsEcCalibrationAudioUninitCb cb);
+
+/**
+ * @}
+**/
+
+typedef void * (*LinphoneCoreWaitingCallback)(LinphoneCore *lc, void *context, LinphoneWaitingState ws, const char *purpose, float progress);
+
+
+/**
+ * @addtogroup initializing
+ * @{
+**/
+
+/**
+ * Tells whether the linphone core log collection is enabled.
+ * @return The state of the linphone core log collection.
+ */
+LINPHONE_PUBLIC LinphoneLogCollectionState linphone_core_log_collection_enabled(void);
+
+/**
+ * Enable the linphone core log collection to upload logs on a server.
+ * @param[in] state #LinphoneLogCollectionState value telling whether to enable log collection or not.
+ */
+LINPHONE_PUBLIC void linphone_core_enable_log_collection(LinphoneLogCollectionState state);
+
+/**
+ * Get the path where the log files will be written for log collection.
+ * @return The path where the log files will be written.
+ */
+LINPHONE_PUBLIC const char * linphone_core_get_log_collection_path(void);
+
+/**
+ * Set the path of a directory where the log files will be written for log collection.
+ * @param[in] path The path where the log files will be written.
+ */
+LINPHONE_PUBLIC void linphone_core_set_log_collection_path(const char *path);
+
+/**
+ * Get the prefix of the filenames that will be used for log collection.
+ * @return The prefix of the filenames used for log collection.
+ */
+LINPHONE_PUBLIC const char * linphone_core_get_log_collection_prefix(void);
+
+/**
+ * Set the prefix of the filenames that will be used for log collection.
+ * @param[in] prefix The prefix to use for the filenames for log collection.
+ */
+LINPHONE_PUBLIC void linphone_core_set_log_collection_prefix(const char *prefix);
+
+/**
+ * Get the max file size in bytes of the files used for log collection.
+ * @return The max file size in bytes of the files used for log collection.
+ */
+LINPHONE_PUBLIC size_t linphone_core_get_log_collection_max_file_size(void);
+
+/**
+ * Set the max file size in bytes of the files used for log collection.
+ * Warning: this function should only not be used to change size
+ * dynamically but instead only before calling @see
+ * linphone_core_enable_log_collection. If you increase max size
+  * on runtime, logs chronological order COULD be broken.
+ * @param[in] size The max file size in bytes of the files used for log collection.
+ */
+LINPHONE_PUBLIC void linphone_core_set_log_collection_max_file_size(size_t size);
+
+/**
+ * Set the url of the server where to upload the collected log files.
+ * @param[in] core #LinphoneCore object
+ * @param[in] server_url The url of the server where to upload the collected log files.
+ */
+LINPHONE_PUBLIC void linphone_core_set_log_collection_upload_server_url(LinphoneCore *core, const char *server_url);
+
+/**
+ * Gets the url of the server where to upload the collected log files.
+ * @param[in] core #LinphoneCore object
+ * @return The url of the server where to upload the collected log files.
+ */
+LINPHONE_PUBLIC const char * linphone_core_get_log_collection_upload_server_url(LinphoneCore *core);
+
+/**
+ * Upload the log collection to the configured server url.
+ * @param[in] core #LinphoneCore object
+ */
+LINPHONE_PUBLIC void linphone_core_upload_log_collection(LinphoneCore *core);
+
+/**
+ * Compress the log collection in a single file.
+ * @return The path of the compressed log collection file (to be freed calling ms_free()).
+ */
+LINPHONE_PUBLIC char * linphone_core_compress_log_collection(void);
+
+/**
+ * Reset the log collection by removing the log files.
+ */
+LINPHONE_PUBLIC void linphone_core_reset_log_collection(void);
+
+/**
+ * @brief Define a log handler.
+ * @param logfunc The function pointer of the log handler.
+ * @deprecated Use #linphone_logging_service_cbs_set_log_message_written() instead. Deprecated since 2017-10-10.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_log_handler(OrtpLogFunc logfunc);
+
+/**
+ * @brief Define a log file.
+ *
+ * If the file pointer passed as an argument is NULL, stdout is used instead.
+ * @param file A pointer to the FILE structure of the file to write to.
+ * @deprecated Use #linphone_log_service_set_file() instead. Deprecated since 2017-10-10.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_log_file(FILE *file);
+
+/**
+ * @brief Define the minimum level for logging.
+ * @param loglevel Minimum level for logging messages.
+ * @deprecated Use #linphone_logging_service_set_log_level() instead. Deprecated since 2017-10-10.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_log_level(OrtpLogLevel loglevel);
+
+/**
+ * Define the log level using mask.
+ *
+ * The loglevel parameter is a bitmask parameter. Therefore to enable only warning and error
+ * messages, use ORTP_WARNING | ORTP_ERROR. To disable logs, simply set loglevel to 0.
+ *
+ * @param mask A bitmask of the log levels to set.
+ * @deprecated Use #linphone_logging_service_set_log_level() instead. Deprecated since 2017-10-10.
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_log_level_mask(unsigned int mask);
+
+/**
+ * Get defined log level mask.
+ *
+ * @return The loglevel parameter is a bitmask parameter. Therefore to enable only warning and error
+ * messages, use ORTP_WARNING | ORTP_ERROR. To disable logs, simply set loglevel to 0.
+ * @deprecated Use #linphone_logging_service_get_log_level_mask() instead. Deprecated since 2017-10-10.
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED unsigned int linphone_core_get_log_level_mask(void);
+
+/**
+ * Enable logs in supplied FILE*.
+ * @param file a C FILE* where to fprintf logs. If null stdout is used.
+ * @deprecated Use #linphone_core_set_log_file and #linphone_core_set_log_level() instead.
+ * Deprecated since 2017-01-12.
+ * @donotwrap
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_core_enable_logs(FILE *file);
+
+/**
+ * Enable logs through the user's supplied log callback.
+ * @param logfunc The address of a OrtpLogFunc callback whose protoype is
+ *            	  typedef void (*OrtpLogFunc)(OrtpLogLevel lev, const char *fmt, va_list args);
+ * @deprecated Use #linphone_core_set_log_handler and #linphone_core_set_log_level instead.
+ * Deprecated since 2017-01-12.
+ * @donotwrap
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_core_enable_logs_with_cb(OrtpLogFunc logfunc);
+
+/**
+ * Entirely disable logging.
+ * @deprecated Use #linphone_core_set_log_level() instead. Deprecated since 2017-01-12.
+ * @donotwrap
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_core_disable_logs(void);
+
+/**
+ * Enable logs serialization (output logs from either the thread that creates the linphone core or the thread that calls linphone_core_iterate()).
+ * Must be called before creating the linphone core.
+ */
+LINPHONE_PUBLIC void linphone_core_serialize_logs(void);
+
+/**
+ * Returns liblinphone's version as a string.
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_version(void);
+
+/**
+ * @return liblinphone's user agent as a string.
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_user_agent(LinphoneCore *lc);
+
+/**
+ * @deprecated Use #linphone_core_get_user_agent() instead.
+ * Deprecated since 2015-11-19.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const char *linphone_core_get_user_agent_name(void);
+
+/**
+ * @deprecated Use #linphone_core_get_user_agent instead.
+ * Deprecated since 2015-11-19.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const char *linphone_core_get_user_agent_version(void);
+
+/**
+ * @}
+**/
+
+/**
+ * Instanciates a #LinphoneCore object.
+ * @ingroup initializing
+ *
+ * The #LinphoneCore object is the primary handle for doing all phone actions.
+ * It should be unique within your application.
+ * @param vtable a #LinphoneCoreVTable structure holding your application callbacks
+ * @param config_path a path to a config file. If it does not exists it will be created.
+ *        The config file is used to store all settings, call logs, friends, proxies... so that all these settings
+ *        become persistent over the life of the LinphoneCore object.
+ *        It is allowed to set a NULL config file. In that case LinphoneCore will not store any settings.
+ * @param factory_config_path a path to a read-only config file that can be used to
+ *        to store hard-coded preference such as proxy settings or internal preferences.
+ *        The settings in this factory file always override the one in the normal config file.
+ *        It is OPTIONAL, use NULL if unneeded.
+ * @param userdata an opaque user pointer that can be retrieved at any time (for example in
+ *        callbacks) using linphone_core_get_user_data().
+ * @see linphone_core_new_with_config
+ * @deprecated Use #linphone_factory_create_core() instead. Deprecated since 2017-01-12.
+ * @donotwrap
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable,
+						const char *config_path, const char *factory_config_path, void* userdata);
+
+/**
+ * Instantiates a #LinphoneCore object with a given LpConfig.
+ * @ingroup initializing
+ *
+ * The #LinphoneCore object is the primary handle for doing all phone actions.
+ * It should be unique within your application.
+ * @param vtable a #LinphoneCoreVTable structure holding your application callbacks
+ * @param config a pointer to an LpConfig object holding the configuration of the #LinphoneCore to be instantiated.
+ * @param userdata an opaque user pointer that can be retrieved at any time (for example in
+ *        callbacks) using linphone_core_get_user_data().
+ * @see linphone_core_new
+ * @deprecated Use #linphone_factory_create_core_with_config() instead. Deprecated since 2017-01-12.
+ * @donotwrap
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneCore *linphone_core_new_with_config(const LinphoneCoreVTable *vtable, LpConfig *config, void *userdata);
+
+/**
+ * Start a #LinphoneCore object after it has been instantiated and not automatically started.
+ * Also re-initialize a #LinphoneCore object that has been stopped using linphone_core_stop().
+ * Must be called only if #LinphoneGlobalState is either Ready of Off. State will changed to Startup, Configuring and then On.
+ * @ingroup initializing
+ * @param[in] core The #LinphoneCore object to be started
+ * @return 0: success, -1: global failure, -2: could not connect database
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_start(LinphoneCore *lc);
+
+/**
+ * Stop a #LinphoneCore object after it has been instantiated and started.
+ * If stopped, it can be started again using linphone_core_start().
+ * Must be called only if #LinphoneGlobalState is either On. State will changed to Shutdown and then Off.
+ * @ingroup initializing
+ * @param[in] core The #LinphoneCore object to be stopped
+ */
+LINPHONE_PUBLIC void linphone_core_stop (LinphoneCore *core);
+
+/**
+ * Increment the reference counter of a #LinphoneCore object.
+ * @param lc The #LinphoneCore which the ref counter is to be incremented.
+ * @return A pointer on the #LinphoneCore passed as parameter.
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC LinphoneCore *linphone_core_ref(LinphoneCore *lc);
+
+/**
+ * Decrement the ref counter of a #LinphoneCore object and destroy it
+ * if the counter reach 0.
+ * @param lc The #LinphoneCore which the reference counter is to be decreased.
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC void linphone_core_unref(LinphoneCore *lc);
+
+/**
+ * Main loop function. It is crucial that your application call it periodically.
+ *
+ * linphone_core_iterate() performs various backgrounds tasks:
+ * - receiving of SIP messages
+ * - handles timers and timeout
+ * - performs registration to proxies
+ * - authentication retries
+ * The application MUST call this function periodically, in its main loop.
+ * Be careful that this function must be called from the same thread as
+ * other liblinphone methods. If it is not the case make sure all liblinphone calls are
+ * serialized with a mutex.
+ * For ICE to work properly it should be called every 20ms.
+ * @param[in] lc #LinphoneCore object
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC void linphone_core_iterate(LinphoneCore *lc);
+
+/**
+ * @ingroup initializing
+ * add a listener to be notified of linphone core events. Once events are received, registered vtable are invoked in order.
+ * @param vtable a #LinphoneCoreVTable structure holding your application callbacks. Object is owned by linphone core until linphone_core_remove_listener.
+ * @param lc object
+ * @deprecated Use linphone_core_add_callbacks() instead. Deprecated since 2017-01-12.
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_core_add_listener(LinphoneCore *lc, LinphoneCoreVTable *vtable);
+
+/**
+ * @ingroup initializing
+ * Add a listener in order to be notified of #LinphoneCore events. Once an event is received, registred #LinphoneCoreCbs are
+ * invoked sequencially.
+ * @param lc The #LinphoneCore object to monitor.
+ * @param cbs A #LinphoneCoreCbs object holding the callbacks you need. A reference is taken by #LinphoneCore until you invoke linphone_core_remove_callbacks().
+ */
+LINPHONE_PUBLIC void linphone_core_add_callbacks(LinphoneCore *lc, LinphoneCoreCbs *cbs);
+
+/**
+ * @ingroup initializing
+ * remove a listener registred by linphone_core_add_listener.
+ * @param lc object
+ * @param vtable a #LinphoneCoreVTable structure holding your application callbacks.
+ * @deprecated Use linphone_core_remove_callbacks() instead. Deprecated since 2017-01-12.
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_core_remove_listener(LinphoneCore *lc, const LinphoneCoreVTable *vtable);
+
+/**
+ * @ingroup initializing
+ * Remove a listener from a #LinphoneCore
+ * @param lc The #LinphoneCore
+ * @param cbs The pointer on the #LinphoneCoreCbs to remove.
+ */
+LINPHONE_PUBLIC void linphone_core_remove_callbacks(LinphoneCore *lc, const LinphoneCoreCbs *cbs);
+
+/**
+ * @brief Set the user agent string used in SIP messages.
+ *
+ * Set the user agent string used in SIP messages as "[ua_name]/[version]". No slash character will be printed if NULL is given to "version".
+ * If NULL is given to "ua_name" and "version" both, the User-agent header will be empty.
+ *
+ * This function should be called just after linphone_factory_create_core() ideally.
+ * @param[in] lc The core.
+ * @param[in] ua_name Name of the user agent.
+ * @param[in] version Version of the user agent.
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC void linphone_core_set_user_agent(LinphoneCore *lc, const char *ua_name, const char *version);
+
+/**
+ * See linphone_proxy_config_normalize_sip_uri for documentation. Default proxy config is used to parse
+ * the address.
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC LinphoneAddress * linphone_core_interpret_url(LinphoneCore *lc, const char *url);
+
+/**
+ * @brief Initiates an outgoing call.
+ *
+ * The application doesn't own a reference to the returned LinphoneCall object.
+ * Use linphone_call_ref() to safely keep the LinphoneCall pointer valid within your application.
+ *
+ * @param[in] lc LinphoneCore object
+ * @param[in] url The destination of the call (sip address, or phone number).
+ * @return A #LinphoneCall object or NULL in case of failure
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC LinphoneCall * linphone_core_invite(LinphoneCore *lc, const char *url);
+
+/**
+ * Initiates an outgoing call given a destination #LinphoneAddress
+ * The #LinphoneAddress can be constructed directly using linphone_address_new(), or
+ * created by linphone_core_interpret_url().
+ * The application doesn't own a reference to the returned #LinphoneCall object.
+ * Use linphone_call_ref() to safely keep the #LinphoneCall pointer valid within your application.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] addr The destination of the call (sip address).
+ * @return A #LinphoneCall object or NULL in case of failure
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC LinphoneCall * linphone_core_invite_address(LinphoneCore *lc, const LinphoneAddress *addr);
+
+/**
+ * Initiates an outgoing call according to supplied call parameters
+ * The application doesn't own a reference to the returned #LinphoneCall object.
+ * Use linphone_call_ref() to safely keep the #LinphoneCall pointer valid within your application.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] url The destination of the call (sip address, or phone number).
+ * @param[in] params Call parameters
+ * @return A #LinphoneCall object or NULL in case of failure
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC LinphoneCall * linphone_core_invite_with_params(LinphoneCore *lc, const char *url, const LinphoneCallParams *params);
+
+/**
+ * Initiates an outgoing call given a destination #LinphoneAddress
+ * The #LinphoneAddress can be constructed directly using linphone_address_new(), or
+ * created by linphone_core_interpret_url().
+ * The application doesn't own a reference to the returned #LinphoneCall object.
+ * Use linphone_call_ref() to safely keep the #LinphoneCall pointer valid within your application.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] addr The destination of the call (sip address).
+ * @param[in] params Call parameters
+ * @return A #LinphoneCall object or NULL in case of failure
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC LinphoneCall * linphone_core_invite_address_with_params(LinphoneCore *lc, const LinphoneAddress *addr, const LinphoneCallParams *params);
+
+/**
+ * @brief Performs a simple call transfer to the specified destination.
+ *
+ * The remote endpoint is expected to issue a new call to the specified destination.
+ * The current call remains active and thus can be later paused or terminated.
+ * It is possible to follow the progress of the transfer provided that transferee sends notification about it.
+ * In this case, the transfer_state_changed callback of the #LinphoneCoreVTable is invoked to notify of the state of the new call at the other party.
+ * The notified states are #LinphoneCallOutgoingInit , #LinphoneCallOutgoingProgress, #LinphoneCallOutgoingRinging and #LinphoneCallConnected.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The call to be transfered
+ * @param[in] refer_to The destination the call is to be refered to
+ * @return 0 on success, -1 on failure
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_transfer() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_transfer_call(LinphoneCore *lc, LinphoneCall *call, const char *refer_to);
+
+/**
+ * @brief Transfers a call to destination of another running call. This is used for "attended transfer" scenarios.
+ *
+ * The transfered call is supposed to be in paused state, so that it is able to accept the transfer immediately.
+ * The destination call is a call previously established to introduce the transfered person.
+ * This method will send a transfer request to the transfered person. The phone of the transfered is then
+ * expected to automatically call to the destination of the transfer. The receiver of the transfer will then automatically
+ * close the call with us (the 'dest' call).
+ * It is possible to follow the progress of the transfer provided that transferee sends notification about it.
+ * In this case, the transfer_state_changed callback of the #LinphoneCoreVTable is invoked to notify of the state of the new call at the other party.
+ * The notified states are #LinphoneCallOutgoingInit , #LinphoneCallOutgoingProgress, #LinphoneCallOutgoingRinging and #LinphoneCallConnected.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call A running call you want to transfer
+ * @param[in] dest A running call whose remote person will receive the transfer
+ * @return 0 on success, -1 on failure
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_transfer_to_another() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_transfer_call_to_another(LinphoneCore *lc, LinphoneCall *call, LinphoneCall *dest);
+
+/**
+ * @brief Start a new call as a consequence of a transfer request received from a call.
+ *
+ * This function is for advanced usage: the execution of transfers is automatically managed by the LinphoneCore. However if an application
+ * wants to have control over the call parameters for the new call, it should call this function immediately during the #LinphoneCallRefered notification.
+ * @see LinphoneCoreVTable::call_state_changed
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call A call that has just been notified about #LinphoneCallRefered state event.
+ * @param[in] params The call parameters to be applied to the new call.
+ * @return A #LinphoneCall corresponding to the new call that is attempted to the transfer destination.
+**/
+LINPHONE_PUBLIC LinphoneCall * linphone_core_start_refered_call(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params);
+
+/** @deprecated Use linphone_core_is_incoming_invite_pending() instead. */
+#define linphone_core_inc_invite_pending(lc) linphone_core_is_incoming_invite_pending(lc)
+
+/**
+ * @brief Tells whether there is an incoming invite pending.
+ *
+ * @ingroup call_control
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean telling whether an incoming invite is pending or not.
+ */
+LINPHONE_PUBLIC bool_t linphone_core_is_incoming_invite_pending(LinphoneCore*lc);
+
+/**
+ * Tells whether there is a call running.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether a call is currently running or not
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC bool_t linphone_core_in_call(const LinphoneCore *lc);
+
+/**
+ * Gets the current call.
+ * @param[in] lc #LinphoneCore object
+ * @return The current call or NULL if no call is running
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC LinphoneCall *linphone_core_get_current_call(const LinphoneCore *lc);
+
+/**
+ * @brief Accept an incoming call.
+ *
+ * Basically the application is notified of incoming calls within the
+ * call_state_changed callback of the #LinphoneCoreVTable structure, where it will receive
+ * a #LinphoneCallIncoming event with the associated #LinphoneCall object.
+ * The application can later accept the call using this method.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The #LinphoneCall object representing the call to be answered
+ * @return 0 on success, -1 on failure
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_accept() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_accept_call(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * @brief Accept an incoming call, with parameters.
+ *
+ * Basically the application is notified of incoming calls within the
+ * call_state_changed callback of the #LinphoneCoreVTable structure, where it will receive
+ * a #LinphoneCallIncoming event with the associated #LinphoneCall object.
+ * The application can later accept the call using
+ * this method.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The #LinphoneCall object representing the call to be answered
+ * @param[in] params The specific parameters for this call, for example whether video is accepted or not. Use NULL to use default parameters
+ * @return 0 on success, -1 on failure
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_accept_with_params() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params);
+
+/**
+ * @brief When receiving an incoming, accept to start a media session as early-media.
+ *
+ * This means the call is not accepted but audio & video streams can be established if the remote party supports early media.
+ * However, unlike after call acceptance, mic and camera input are not sent during early-media, though received audio & video are played normally.
+ * The call can then later be fully accepted using linphone_core_accept_call() or linphone_core_accept_call_with_params().
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The call to accept
+ * @param[in] params The call parameters to use (can be NULL)
+ * @return 0 if successful, -1 otherwise
+ * @ingroup call_control
+ * @deprecated Use linphone_call_accept_early_media_with_params() instead.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_accept_early_media_with_params(LinphoneCore* lc, LinphoneCall* call, const LinphoneCallParams* params);
+
+/**
+ * @brief Accept an early media session for an incoming call.
+ *
+ * This is identical as calling linphone_core_accept_early_media_with_params() with NULL call parameters.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The incoming call to accept
+ * @return 0 if successful, -1 otherwise
+ * @ingroup call_control
+ * @see linphone_core_accept_early_media_with_params()
+ * @deprecated Use #linphone_call_accept_early_media() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_accept_early_media(LinphoneCore* lc, LinphoneCall* call);
+
+/**
+ * @brief Terminates a call.
+ *
+ * @param[in] lc LinphoneCore object
+ * @param[in] call The LinphoneCall object representing the call to be terminated
+ * @return 0 on success, -1 on failure
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_terminate() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_terminate_call(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * Redirect the specified call to the given redirect URI.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The #LinphoneCall to redirect
+ * @param[in] redirect_uri The URI to redirect the call to
+ * @return 0 if successful, -1 on error.
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_redirect() instead. Deprecated since 2017-02-13.
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_redirect_call(LinphoneCore *lc, LinphoneCall *call, const char *redirect_uri);
+
+/**
+ * @brief Decline a pending incoming call, with a reason.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The #LinphoneCall to decline, must be in the IncomingReceived state
+ * @param[in] reason The reason for rejecting the call: #LinphoneReasonDeclined or #LinphoneReasonBusy
+ * @return 0 on success, -1 on failure
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_decline() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_decline_call(LinphoneCore *lc, LinphoneCall * call, LinphoneReason reason);
+
+/**
+ * Terminates all the calls.
+ * @param[in] lc #LinphoneCore object
+ * @return 0
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_terminate_all_calls(LinphoneCore *lc);
+
+/**
+ * @brief Pauses the call. If a music file has been setup using linphone_core_set_play_file(),
+ * this file will be played to the remote user.
+ *
+ * The only way to resume a paused call is to call linphone_core_resume_call().
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The call to pause
+ * @return 0 on success, -1 on failure
+ * @ingroup call_control
+ * @see linphone_core_resume_call()
+ * @deprecated Use #linphone_call_pause() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * Pause all currently running calls.
+ * @param[in] lc #LinphoneCore object
+ * @return 0
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_pause_all_calls(LinphoneCore *lc);
+
+/**
+ * @brief Resumes a call.
+ *
+ * The call needs to have been paused previously with linphone_core_pause_call().
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The call to resume
+ * @return 0 on success, -1 on failure
+ * @ingroup call_control
+ * @see linphone_core_pause_call()
+ * @deprecated Use #linphone_call_resume() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_resume_call(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * @brief Updates a running call according to supplied call parameters or parameters changed in the LinphoneCore.
+ *
+ * In this version this is limited to the following use cases:
+ * - setting up/down the video stream according to the video parameter of the #LinphoneCallParams (see linphone_call_params_enable_video() ).
+ * - changing the size of the transmitted video after calling linphone_core_set_preferred_video_size()
+ * In case no changes are requested through the #LinphoneCallParams argument, then this argument can be omitted and set to NULL.
+ * WARNING: Updating a call in the #LinphoneCallPaused state will still result in a paused call even if the media directions set in the
+ * params are sendrecv. To resume a paused call, you need to call linphone_core_resume_call().
+ *
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The call to be updated
+ * @param[in] params The new call parameters to use (may be NULL)
+ * @return 0 if successful, -1 otherwise.
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_update() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_update_call(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params);
+
+/**
+ * When receiving a #LinphoneCallUpdatedByRemote state notification, prevent #LinphoneCore from performing an automatic answer.
+ *
+ * When receiving a #LinphoneCallUpdatedByRemote state notification (ie an incoming reINVITE), the default behaviour of
+ * #LinphoneCore is defined by the "defer_update_default" option of the "sip" section of the config. If this option is 0 (the default)
+ * then the #LinphoneCore automatically answers the reINIVTE with call parameters unchanged.
+ * However when for example when the remote party updated the call to propose a video stream, it can be useful
+ * to prompt the user before answering. This can be achieved by calling linphone_core_defer_call_update() during
+ * the call state notification, to deactivate the automatic answer that would just confirm the audio but reject the video.
+ * Then, when the user responds to dialog prompt, it becomes possible to call linphone_core_accept_call_update() to answer
+ * the reINVITE, with eventually video enabled in the #LinphoneCallParams argument.
+ *
+ * The #LinphoneCallUpdatedByRemote notification can also arrive when receiving an INVITE without SDP. In such case, an unchanged offer is made
+ * in the 200Ok, and when the ACK containing the SDP answer is received, #LinphoneCallUpdatedByRemote is triggered to notify the application of possible
+ * changes in the media session. However in such case defering the update has no meaning since we just generating an offer.
+ *
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The call for which to defer the update
+ * @return 0 if successful, -1 if the linphone_core_defer_call_update() was done outside a valid #LinphoneCallUpdatedByRemote notification
+ * @ingroup call_control
+ * @deprecated Use linphone_call_defer_update() instead
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_defer_call_update(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * @brief Accept call modifications initiated by other end.
+ *
+ * This call may be performed in response to a #LinphoneCallUpdatedByRemote state notification.
+ * When such notification arrives, the application can decide to call linphone_core_defer_update_call() so that it can
+ * have the time to prompt the user. linphone_call_get_remote_params() can be used to get information about the call parameters
+ * requested by the other party, such as whether a video stream is requested.
+ *
+ * When the user accepts or refuse the change, linphone_core_accept_call_update() can be done to answer to the other party.
+ * If params is NULL, then the same call parameters established before the update request will continue to be used (no change).
+ * If params is not NULL, then the update will be accepted according to the parameters passed.
+ * Typical example is when a user accepts to start video, then params should indicate that video stream should be used
+ * (see linphone_call_params_enable_video()).
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call The call for which to accept an update
+ * @param[in] params A #LinphoneCallParams object describing the call parameters to accept
+ * @return 0 if successful, -1 otherwise (actually when this function call is performed outside ot #LinphoneCallUpdatedByRemote state)
+ * @ingroup call_control
+ * @deprecated Use #linphone_call_accept_update() instead. Deprecated since 2017-02-13.
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_accept_call_update(LinphoneCore *lc, LinphoneCall *call, const LinphoneCallParams *params);
+
+/**
+ * Create a #LinphoneCallParams suitable for linphone_core_invite_with_params(), linphone_core_accept_call_with_params(), linphone_core_accept_early_media_with_params(),
+ * linphone_core_accept_call_update().
+ * The parameters are initialized according to the current #LinphoneCore configuration and the current state of the LinphoneCall.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call #LinphoneCall for which the parameters are to be build, or NULL in the case where the parameters are to be used for a new outgoing call.
+ * @return A new #LinphoneCallParams object
+ * @ingroup call_control
+ */
+LINPHONE_PUBLIC LinphoneCallParams *linphone_core_create_call_params(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * Get the call with the remote_address specified
+ * @param[in] lc #LinphoneCore object
+ * @param[in] remote_address The remote address of the call that we want to get
+ * @return The call if it has been found, NULL otherwise
+ * @ingroup call_control
+ */
+LINPHONE_PUBLIC LinphoneCall *linphone_core_get_call_by_remote_address(const LinphoneCore *lc, const char *remote_address);
+
+/**
+ * Get the call with the remote_address specified
+ * @param lc
+ * @param remote_address
+ * @return the #LinphoneCall of the call if found
+ *
+ * @ingroup call_control
+ */
+LINPHONE_PUBLIC LinphoneCall *linphone_core_get_call_by_remote_address2(const LinphoneCore *lc, const LinphoneAddress *remote_address);
+
+/**
+ * @brief Send the specified dtmf.
+ *
+ * This function only works during calls. The dtmf is automatically played to the user.
+ * @param lc The #LinphoneCore object
+ * @param dtmf The dtmf name specified as a char, such as '0', '#' etc...
+ * @deprecated Use #linphone_call_send_dtmf instead. Deprecated since 2015-11-23.
+ * @ingroup media_parameters
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_send_dtmf(LinphoneCore *lc, char dtmf);
+
+/**
+ * Sets the local "from" identity.
+ *
+ * @ingroup proxies
+ * This data is used in absence of any proxy configuration or when no
+ * default proxy configuration is set. See #LinphoneProxyConfig
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_primary_contact(LinphoneCore *lc, const char *contact);
+
+/**
+ * Returns the default identity when no proxy configuration is used.
+ *
+ * @ingroup proxies
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_primary_contact(LinphoneCore *lc);
+
+/**
+ * Gets the default identity SIP address.
+ * This is an helper function.
+ * If no default proxy is set, this will return the primary contact (
+ * see linphone_core_get_primary_contact() ). If a default proxy is set
+ * it returns the registered identity on the proxy.
+ * @param[in] lc #LinphoneCore object
+ * @return The default identity SIP address
+ * @ingroup proxies
+**/
+LINPHONE_PUBLIC const char * linphone_core_get_identity(LinphoneCore *lc);
+
+/**
+ * Tells #LinphoneCore to guess local hostname automatically in primary contact.
+ * @ingroup proxies
+**/
+LINPHONE_PUBLIC void linphone_core_set_guess_hostname(LinphoneCore *lc, bool_t val);
+
+/**
+ * Returns TRUE if hostname part of primary contact is guessed automatically.
+ * @ingroup proxies
+**/
+LINPHONE_PUBLIC bool_t linphone_core_get_guess_hostname(LinphoneCore *lc);
+
+/**
+ * Tells to #LinphoneCore to use Linphone Instant Messaging encryption
+ * @param[in] lc #LinphoneCore object
+ * @param[in] val The new lime state
+ * @ingroup network_parameters
+ * @deprecated  Use linphone_core_enable_lime_x3dh instead. Depreacted since 2019-02-04
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_enable_lime(LinphoneCore *lc, LinphoneLimeState val);
+
+/**
+ * Returns the lime state
+ * @param[in] lc #LinphoneCore object
+ * @return The current lime state
+ * @ingroup network_parameters
+ * @deprecated Use linphone_core_lime_x3dh_enabled instead. Depreacted since 2019-02-04
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneLimeState linphone_core_lime_enabled(const LinphoneCore *lc);
+
+/**
+ * Tells if lime is available
+ * @param[in] lc #LinphoneCore object
+ * @ingroup network_parameters
+ * @deprecated Use linphone_core_lime_x3dh_available instead. Depreacted since 2019-02-04
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_core_lime_available(const LinphoneCore *lc);
+
+/**
+ * Tells to LinphoneCore to use LIME X3DH
+ * @param[in] lc LinphoneCore object
+ * @param[in] enable A boolean value telling whether to enable or disable LIME X3DH
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC void linphone_core_enable_lime_x3dh(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Tells wether LIME X3DH is enabled or not
+ * @param[in] lc LinphoneCore object
+ * @return The current lime state
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC bool_t linphone_core_lime_x3dh_enabled(const LinphoneCore *lc);
+
+/**
+ * Set the x3dh server url.
+ * If empty, this function will disable LIME X3DH from core.
+ * Otherwise, or if different from the existing value, this will (re-)initialize the LIME X3DH engine.
+ * @param[in] lc LinphoneCore object
+ * @param[in] url The x3dh server url
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC void linphone_core_set_lime_x3dh_server_url(LinphoneCore *lc, const char *url);
+
+/**
+ * Get the x3dh server url.
+ * @param[in] lc LinphoneCore object
+ * return The x3dh server url
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_lime_x3dh_server_url(LinphoneCore *lc);
+
+/**
+ * Tells if LIME X3DH is available
+ * @param[in] lc LinphoneCore object
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC bool_t linphone_core_lime_x3dh_available(const LinphoneCore *lc);
+
+/**
+ * Tells whether IPv6 is enabled or not.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether IPv6 is enabled or not
+ * @ingroup network_parameters
+ * @see linphone_core_enable_ipv6() for more details on how IPv6 is supported in liblinphone.
+**/
+LINPHONE_PUBLIC bool_t linphone_core_ipv6_enabled(LinphoneCore *lc);
+
+/**
+ * Turns IPv6 support on or off.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] val A boolean value telling whether to enable IPv6 support
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_ipv6(LinphoneCore *lc, bool_t val);
+
+/**
+ * Tells whether NACK context is enabled or not.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether NACK context is enabled or not
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_retransmission_on_nack_enabled(LinphoneCore *lc);
+
+/**
+ * Turns NACK context on or off.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] val A boolean value telling whether to enable NACK context
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_retransmission_on_nack(LinphoneCore *lc, bool_t val);
+
+/**
+ * Tells whether Wifi only mode is enabled or not
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether Wifi only mode is enabled or not
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_wifi_only_enabled(LinphoneCore *lc);
+
+/**
+ * Turns Wifi only mode on or off
+ * @param[in] lc #LinphoneCore object
+ * @param[in] val A boolean value telling whether to enable IPv6 support
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_wifi_only(LinphoneCore *lc, bool_t val);
+
+/**
+ * Same as linphone_core_get_primary_contact() but the result is a #LinphoneAddress object
+ * instead of const char *.
+ *
+ * @ingroup proxies
+ * @deprecated Use linphone_core_create_primary_contact_parsed() instead. Deprecated since 2018-10-22.
+**/
+LINPHONE_PUBLIC LinphoneAddress *linphone_core_get_primary_contact_parsed(LinphoneCore *lc);
+
+/**
+ * Same as linphone_core_get_primary_contact() but the result is a #LinphoneAddress object
+ * instead of const char *.
+ *
+ * @ingroup proxies
+**/
+LINPHONE_PUBLIC LinphoneAddress *linphone_core_create_primary_contact_parsed (LinphoneCore *lc);
+
+LINPHONE_PUBLIC const char * linphone_core_get_identity(LinphoneCore *lc);
+
+/**
+ * Sets maximum available download bandwidth
+ * This is IP bandwidth, in kbit/s.
+ * This information is used signaled to other parties during
+ * calls (within SDP messages) so that the remote end can have
+ * sufficient knowledge to properly configure its audio & video
+ * codec output bitrate to not overflow available bandwidth.
+ *
+ * @ingroup media_parameters
+ *
+ * @param lc the #LinphoneCore object
+ * @param bw the bandwidth in kbits/s, 0 for infinite
+ */
+LINPHONE_PUBLIC void linphone_core_set_download_bandwidth(LinphoneCore *lc, int bw);
+
+/**
+ * Sets maximum available upload bandwidth
+ * This is IP bandwidth, in kbit/s.
+ * This information is used by liblinphone together with remote
+ * side available bandwidth signaled in SDP messages to properly
+ * configure audio & video codec's output bitrate.
+ *
+ * @param lc the #LinphoneCore object
+ * @param bw the bandwidth in kbits/s, 0 for infinite
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_upload_bandwidth(LinphoneCore *lc, int bw);
+
+/**
+ * Sets expected available upload bandwidth
+ * This is IP bandwidth, in kbit/s.
+ * This information is used by liblinphone together with remote
+ * side available bandwidth signaled in SDP messages to properly
+ * configure audio & video codec's output bitrate.
+ *
+ * @param lc the #LinphoneCore object
+ * @param bw the bandwidth in kbits/s, 0 for infinite
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_expected_bandwidth(LinphoneCore *lc, int bw);
+
+/**
+ * Retrieve the maximum available download bandwidth.
+ * This value was set by linphone_core_set_download_bandwidth().
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_download_bandwidth(const LinphoneCore *lc);
+
+/**
+ * Retrieve the maximum available upload bandwidth.
+ * This value was set by linphone_core_set_upload_bandwidth().
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_upload_bandwidth(const LinphoneCore *lc);
+
+/**
+ * Enable adaptive rate control.
+ *
+ * Adaptive rate control consists in using RTCP feedback provided information to dynamically
+ * control the output bitrate of the audio and video encoders, so that we can adapt to the network conditions and
+ * available bandwidth. Control of the audio encoder is done in case of audio-only call, and control of the video encoder is done for audio & video calls.
+ * Adaptive rate control feature is enabled by default.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_adaptive_rate_control(LinphoneCore *lc, bool_t enabled);
+
+/**
+ * Returns whether adaptive rate control is enabled.
+ * @see linphone_core_enable_adaptive_rate_control()
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_adaptive_rate_control_enabled(const LinphoneCore *lc);
+
+/**
+ * Sets adaptive rate algorithm. It will be used for each new calls starting from
+ * now. Calls already started will not be updated.
+ * @param lc the core
+ * @param algorithm the adaptive rate control algorithm. Currently two values are supported: 'advanced', which is the default value, or 'basic'.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_adaptive_rate_algorithm(LinphoneCore *lc, const char *algorithm);
+
+/**
+ * Returns which adaptive rate algorithm is currently configured for future calls.
+ * @see linphone_core_set_adaptive_rate_algorithm()
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char* linphone_core_get_adaptive_rate_algorithm(const LinphoneCore *lc);
+
+/**
+ * Set audio packetization time linphone expects to receive from peer.
+ * A value of zero means that ptime is not specified.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_download_ptime(LinphoneCore *lc, int ptime);
+
+/**
+ * Get audio packetization time linphone expects to receive from peer.
+ * A value of zero means that ptime is not specified.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC int  linphone_core_get_download_ptime(LinphoneCore *lc);
+
+/**
+ * Set audio packetization time linphone will send (in absence of requirement from peer)
+ * A value of 0 stands for the current codec default packetization time.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_upload_ptime(LinphoneCore *lc, int ptime);
+
+/**
+ * Set audio packetization time linphone will send (in absence of requirement from peer)
+ * A value of 0 stands for the current codec default packetization time.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_upload_ptime(LinphoneCore *lc);
+
+/**
+ * Set the SIP transport timeout.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] timeout_ms The SIP transport timeout in milliseconds.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_sip_transport_timeout(LinphoneCore *lc, int timeout_ms);
+
+/**
+ * Get the SIP transport timeout.
+ * @param[in] lc #LinphoneCore object.
+ * @return The SIP transport timeout in milliseconds.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC int linphone_core_get_sip_transport_timeout(LinphoneCore *lc);
+
+/**
+ * Enable or disable DNS SRV resolution.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] enable TRUE to enable DNS SRV resolution, FALSE to disable it.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_enable_dns_srv(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Tells whether DNS SRV resolution is enabled.
+ * @param[in] lc #LinphoneCore object.
+ * @return TRUE if DNS SRV resolution is enabled, FALSE if disabled.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_dns_srv_enabled(const LinphoneCore *lc);
+
+/**
+ * Enable or disable DNS search (use of local domain if the fully qualified name did return results).
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] enable TRUE to enable DNS search, FALSE to disable it.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_enable_dns_search(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Tells whether DNS search (use of local domain if the fully qualified name did return results) is enabled.
+ * @param[in] lc #LinphoneCore object.
+ * @return TRUE if DNS search is enabled, FALSE if disabled.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_dns_search_enabled(const LinphoneCore *lc);
+
+/**
+ * Tells if the DNS was set by an application
+ * @param[in] lc #LinphoneCore object.
+ * @return TRUE if DNS was set by app, FALSE otherwise.
+ *@ingroup media_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_get_dns_set_by_app(LinphoneCore *lc);
+
+/**
+ * Forces liblinphone to use the supplied list of dns servers, instead of system's ones
+ * and set dns_set_by_app at true or false according to value of servers list.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] servers \bctbx_list{const char *} A list of strings containing the IP addresses of DNS servers to be used.
+ * Setting to NULL restores default behaviour, which is to use the DNS server list provided by the system.
+ * The list is copied internally.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_dns_servers_app(LinphoneCore *lc, const bctbx_list_t *servers);
+
+/**
+ * Forces liblinphone to use the supplied list of dns servers, instead of system's ones.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] servers \bctbx_list{const char *} A list of strings containing the IP addresses of DNS servers to be used.
+ * Setting to NULL restores default behaviour, which is to use the DNS server list provided by the system.
+ * The list is copied internally.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_dns_servers(LinphoneCore *lc, const bctbx_list_t *servers);
+
+/**
+ * Return the list of the available audio payload types.
+ * @param[in] lc The core.
+ * @return \bctbx_list{LinphonePayloadType} A freshly allocated list of the available payload types. The list
+ * must be destroyed with bctbx_list_free() after usage. The elements of the list haven't to be unref.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_core_get_audio_payload_types(LinphoneCore *lc);
+
+/**
+ * Redefine the list of the available payload types.
+ * @param[in] lc The core.
+ * @param[in] payload_types \bctbx_list{LinphonePayloadType} The new list of payload types. The core does not take
+ * ownership on it.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_audio_payload_types(LinphoneCore *lc, const bctbx_list_t *payload_types);
+
+/**
+ * Returns the list of available audio codecs.
+ * @param[in] lc The #LinphoneCore object
+ * @return \bctbx_list{OrtpPayloadType}
+ *
+ * This list is unmodifiable. The ->data field of the bctbx_list_t points a PayloadType
+ * structure holding the codec information.
+ * It is possible to make copy of the list with bctbx_list_copy() in order to modify it
+ * (such as the order of codecs).
+ * @ingroup media_parameters
+ * @deprecated Use linphone_core_get_audio_payload_types() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const bctbx_list_t *linphone_core_get_audio_codecs(const LinphoneCore *lc);
+
+/**
+ * Sets the list of audio codecs.
+ * @param[in] lc The #LinphoneCore object
+ * @param[in] codecs \bctbx_list{OrtpPayloadType}
+ * @return 0
+ * The list is taken by the #LinphoneCore thus the application should not free it.
+ * This list is made of struct PayloadType describing the codec parameters.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_core_set_audio_payload_types() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_set_audio_codecs(LinphoneCore *lc, bctbx_list_t *codecs);
+
+/**
+ * Return the list of the available video payload types.
+ * @param[in] lc The core.
+ * @return \bctbx_list{LinphonePayloadType} A freshly allocated list of the available payload types. The list
+ * must be destroyed with bctbx_list_free() after usage. The elements of the list haven't to be unref.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_core_get_video_payload_types(LinphoneCore *lc);
+
+/**
+ * Redefine the list of the available video payload types.
+ * @param[in] lc The core.
+ * @param[in] payload_types \bctbx_list{LinphonePayloadType} The new list of codecs. The core does not take
+ * ownership on it.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_video_payload_types(LinphoneCore *lc, const bctbx_list_t *payload_types);
+
+/**
+ * Returns the list of available video codecs.
+ * @param[in] lc The #LinphoneCore object
+ * @return \bctbx_list{OrtpPayloadType}
+ *
+ * This list is unmodifiable. The ->data field of the bctbx_list_t points a PayloadType
+ * structure holding the codec information.
+ * It is possible to make copy of the list with bctbx_list_copy() in order to modify it
+ * (such as the order of codecs).
+ * @ingroup media_parameters
+ * @deprecated Use linphone_core_get_video_payload_types() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const bctbx_list_t *linphone_core_get_video_codecs(const LinphoneCore *lc);
+
+/**
+ * Sets the list of video codecs.
+ * @param[in] lc The #LinphoneCore object
+ * @param[in] codecs \bctbx_list{OrtpPayloadType}
+ * @return 0
+ *
+ * The list is taken by the #LinphoneCore thus the application should not free it.
+ * This list is made of struct PayloadType describing the codec parameters.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_core_set_video_payload_types() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_set_video_codecs(LinphoneCore *lc, bctbx_list_t *codecs);
+
+/**
+ * Return the list of the available text payload types.
+ * @param[in] lc The core.
+ * @return \bctbx_list{LinphonePayloadType} A freshly allocated list of the available payload types. The list
+ * must be destroyed with bctbx_list_free() after usage. The elements of the list haven't to be unref.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_core_get_text_payload_types(LinphoneCore *lc);
+
+/**
+ * Redefine the list of the available payload types.
+ * @param[in] lc The core.
+ * @param[in] payload_types \bctbx_list{LinphonePayloadType} The new list of payload types. The core does not take
+ * ownership on it.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_text_payload_types(LinphoneCore *lc, const bctbx_list_t *payload_types);
+
+/**
+ * Returns the list of available text codecs.
+ * @param[in] lc The #LinphoneCore object
+ * @return \bctbx_list{OrtpPayloadType}
+ *
+ * This list is unmodifiable. The ->data field of the bctbx_list_t points a PayloadType
+ * structure holding the codec information.
+ * It is possible to make copy of the list with bctbx_list_copy() in order to modify it
+ * (such as the order of codecs).
+ * @ingroup media_parameters
+ * @deprecated Use linphone_core_get_text_payload_types() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const bctbx_list_t *linphone_core_get_text_codecs(const LinphoneCore *lc);
+
+/**
+ * Sets the list of text codecs.
+ * @param[in] lc The #LinphoneCore object
+ * @param[in] codecs \bctbx_list{LinphonePayloadType}
+ * @return 0
+ *
+ * The list is taken by the #LinphoneCore thus the application should not free it.
+ * This list is made of struct PayloadType describing the codec parameters.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_core_set_text_payload_types() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_set_text_codecs(LinphoneCore *lc, bctbx_list_t *codecs);
+
+/**
+ * Enable RFC3389 generic comfort noise algorithm (CN payload type).
+ * It is disabled by default, because this algorithm is only relevant for legacy codecs (PCMU, PCMA, G722).
+ * @param[in] lc #LinphoneCore object
+ * @param[in] enabled TRUE if enabled, FALSE otherwise.
+ * @deprecated Use linphone_core_enable_generic_comfort_noise() instead
+ */
+#define linphone_core_enable_generic_confort_noise(lc, enabled) linphone_core_enable_generic_comfort_noise(lc, enabled)
+
+/**
+ * Returns enablement of RFC3389 generic comfort noise algorithm.
+ * @param[in] lc #LinphoneCore object
+ * @return TRUE or FALSE.
+ * @deprecated Use linphone_core_generic_comfort_noise_enabled() instead
+ */
+#define linphone_core_generic_confort_noise_enabled(lc) linphone_core_generic_comfort_noise_enabled(lc)
+
+/**
+ * Enable RFC3389 generic comfort noise algorithm (CN payload type).
+ * It is disabled by default, because this algorithm is only relevant for legacy codecs (PCMU, PCMA, G722).
+ * @param[in] lc #LinphoneCore object
+ * @param[in] enabled TRUE if enabled, FALSE otherwise.
+**/
+LINPHONE_PUBLIC void linphone_core_enable_generic_comfort_noise(LinphoneCore *lc, bool_t enabled);
+
+/**
+ * Returns enablement of RFC3389 generic comfort noise algorithm.
+ * @param[in] lc #LinphoneCore object
+ * @return TRUE or FALSE.
+**/
+LINPHONE_PUBLIC bool_t linphone_core_generic_comfort_noise_enabled(const LinphoneCore *lc);
+
+/**
+ * Tells whether the specified payload type is enabled.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] pt The payload type to check.
+ * @return TRUE if the payload type is enabled, FALSE if disabled.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_payload_type_enabled() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_core_payload_type_enabled(const LinphoneCore *lc, const OrtpPayloadType *pt);
+
+/**
+ * Tells whether the specified payload type represents a variable bitrate codec.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] pt The payload type to check.
+ * @return TRUE if the payload type represents a VBR codec, FALSE if disabled.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_payload_type_is_vbr() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_core_payload_type_is_vbr(const LinphoneCore *lc, const OrtpPayloadType *pt);
+
+/**
+ * Set an explicit bitrate (IP bitrate, not codec bitrate) for a given codec, in kbit/s.
+ * @param[in] lc the #LinphoneCore object
+ * @param[in] pt the payload type to modify.
+ * @param[in] bitrate the IP bitrate in kbit/s.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_payload_type_set_normal_bitrate() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_payload_type_bitrate(LinphoneCore *lc, OrtpPayloadType *pt, int bitrate);
+
+/**
+ * Get the bitrate explicitely set with linphone_core_set_payload_type_bitrate().
+ * @param[in] lc the #LinphoneCore object
+ * @param[in] pt the payload type to modify.
+ * @return bitrate the IP bitrate in kbit/s, or -1 if an error occured.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_payload_type_get_bitrate().
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_payload_type_bitrate(LinphoneCore *lc, const OrtpPayloadType *pt);
+
+/**
+ * Enable or disable the use of the specified payload type.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] pt The payload type to enable or disable. It can be retrieved using #linphone_core_find_payload_type
+ * @param[in] enable TRUE to enable the payload type, FALSE to disable it.
+ * @return 0 if successful, any other value otherwise.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_payload_type_enable().
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneStatus linphone_core_enable_payload_type(LinphoneCore *lc, OrtpPayloadType *pt, bool_t enable);
+
+/**
+ * Wildcard value used by #linphone_core_find_payload_type to ignore rate in search algorithm
+ * @ingroup media_parameters
+ */
+#define LINPHONE_FIND_PAYLOAD_IGNORE_RATE -1
+
+/**
+ * Wildcard value used by #linphone_core_find_payload_type to ignore channel in search algorithm
+ * @ingroup media_parameters
+ */
+#define LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS -1
+
+/**
+ * Get payload type from mime type and clock rate.
+ * @ingroup media_parameters
+ * This function searches in audio and video codecs for the given payload type name and clockrate.
+ * @param lc #LinphoneCore object
+ * @param type payload mime type (I.E SPEEX, PCMU, VP8)
+ * @param rate can be #LINPHONE_FIND_PAYLOAD_IGNORE_RATE
+ * @param channels  number of channels, can be #LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS
+ * @return Returns NULL if not found.
+ * @deprecated Use linphone_core_get_payload_type() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED OrtpPayloadType *linphone_core_find_payload_type(LinphoneCore* lc, const char* type, int rate, int channels);
+
+/**
+ * Get payload type from mime type and clock rate.
+ * @ingroup media_parameters
+ * This function searches in audio and video codecs for the given payload type name and clockrate.
+ * @param lc #LinphoneCore object
+ * @param type payload mime type (I.E SPEEX, PCMU, VP8)
+ * @param rate can be #LINPHONE_FIND_PAYLOAD_IGNORE_RATE
+ * @param channels  number of channels, can be #LINPHONE_FIND_PAYLOAD_IGNORE_CHANNELS
+ * @return Returns NULL if not found. If a #LinphonePayloadType is returned, it must be released with
+ * linphone_payload_type_unref() after using it.
+ * @warning The returned payload type is allocated as a floating reference i.e. the reference counter is initialized to 0.
+ */
+LINPHONE_PUBLIC LinphonePayloadType *linphone_core_get_payload_type(LinphoneCore *lc, const char *type, int rate, int channels);
+
+/**
+ * Returns the payload type number assigned for this codec.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_payload_type_get_number() instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_payload_type_number(LinphoneCore *lc, const OrtpPayloadType *pt);
+
+/**
+ * Force a number for a payload type. The #LinphoneCore does payload type number assignment automatically. THis function is to be used mainly for tests, in order
+ * to override the automatic assignment mechanism.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_payload_type_set_number() instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_payload_type_number(LinphoneCore *lc, OrtpPayloadType *pt, int number);
+
+/**
+ * Get a description of the encoder used to supply a payload type.
+ * @param[in] lc The core.
+ * @param[in] pt The payload type.
+ * @return The description of the encoder. Can be NULL if the format is not supported by Mediastreamer2.
+ * @deprecated Use linphone_payload_type_get_encoder_description() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const char *linphone_core_get_payload_type_description(LinphoneCore *lc, const OrtpPayloadType *pt);
+
+/**
+ * Return TRUE if codec can be used with bandwidth, FALSE else
+ * @ingroup media_parameters
+ * @deprecated Use linphone_payload_type_is_usable() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_core_check_payload_type_usability(LinphoneCore *lc, const OrtpPayloadType *pt);
+
+/**
+ * @addtogroup proxies
+ * @{
+ */
+
+/**
+ * Create a proxy config with default values from Linphone core.
+ * @param[in] lc #LinphoneCore object
+ * @return #LinphoneProxyConfig with default values set
+ */
+LINPHONE_PUBLIC LinphoneProxyConfig * linphone_core_create_proxy_config(LinphoneCore *lc);
+
+/**
+ * Add a proxy configuration.
+ * This will start registration on the proxy, if registration is enabled.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_add_proxy_config(LinphoneCore *lc, LinphoneProxyConfig *config);
+
+/**
+ * Erase all proxies from config.
+**/
+LINPHONE_PUBLIC void linphone_core_clear_proxy_config(LinphoneCore *lc);
+
+/**
+ * Removes a proxy configuration.
+ *
+ * #LinphoneCore will then automatically unregister and place the proxy configuration
+ * on a deleted list. For that reason, a removed proxy does NOT need to be freed.
+**/
+LINPHONE_PUBLIC void linphone_core_remove_proxy_config(LinphoneCore *lc, LinphoneProxyConfig *config);
+
+/**
+ * Returns an unmodifiable list of entered proxy configurations.
+ * @param[in] lc The #LinphoneCore object
+ * @return \bctbx_list{LinphoneProxyConfig}
+**/
+LINPHONE_PUBLIC const bctbx_list_t *linphone_core_get_proxy_config_list(const LinphoneCore *lc);
+
+/** @deprecated Use linphone_core_set_default_proxy_config() instead. */
+#define linphone_core_set_default_proxy(lc, config) linphone_core_set_default_proxy_config(lc, config)
+
+LINPHONE_PUBLIC void linphone_core_set_default_proxy_index(LinphoneCore *lc, int index);
+
+/**
+ * @param[in] idkey An arbitrary idkey string associated to a proxy configuration
+ * @return the proxy configuration for the given idkey value, or NULL if none found
+ **/
+LINPHONE_PUBLIC LinphoneProxyConfig *linphone_core_get_proxy_config_by_idkey(LinphoneCore *lc, const char *idkey);
+
+/**
+ * @return the default proxy configuration, that is the one used to determine the current identity.
+ * @deprecated Use linphone_core_get_default_proxy_config() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_default_proxy(LinphoneCore *lc, LinphoneProxyConfig **config);
+
+/**
+ * @return the default proxy configuration, that is the one used to determine the current identity.
+ * @param[in] lc #LinphoneCore object
+ * @return The default proxy configuration.
+**/
+LINPHONE_PUBLIC LinphoneProxyConfig * linphone_core_get_default_proxy_config(const LinphoneCore *lc);
+
+/**
+ * Sets the default proxy.
+ *
+ * This default proxy must be part of the list of already entered LinphoneProxyConfig.
+ * Toggling it as default will make #LinphoneCore use the identity associated with
+ * the proxy configuration in all incoming and outgoing calls.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] config The proxy configuration to use as the default one.
+**/
+LINPHONE_PUBLIC void linphone_core_set_default_proxy_config(LinphoneCore *lc, LinphoneProxyConfig *config);
+
+/**
+ * @}
+ */
+
+/**
+ * Create an authentication information with default values from Linphone core.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] username String containing the username part of the authentication credentials
+ * @param[in] userid String containing the username to use to calculate the authentication digest (optional)
+ * @param[in] passwd String containing the password of the authentication credentials (optional, either passwd or ha1 must be set)
+ * @param[in] ha1 String containing a ha1 hash of the password (optional, either passwd or ha1 must be set)
+ * @param[in] realm String used to discriminate different SIP authentication domains (optional)
+ * @param[in] domain String containing the SIP domain for which this authentication information is valid, if it has to be restricted for a single SIP domain.
+ * @return #LinphoneAuthInfo with default values set
+ * @ingroup authentication
+ * @deprecated use linphone_factory_create_auth_info() instead.
+ */
+LINPHONE_PUBLIC LinphoneAuthInfo * linphone_core_create_auth_info(LinphoneCore *lc, const char *username, const char *userid, const char *passwd, const char *ha1, const char *realm, const char *domain);
+
+/**
+ * Adds authentication information to the #LinphoneCore.
+ * That piece of information will be used during all SIP transactions that require authentication.
+ * @param[in] lc The #LinphoneCore.
+ * @param[in] info The #LinphoneAuthInfo to add.
+ * @ingroup authentication
+ */
+LINPHONE_PUBLIC void linphone_core_add_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *info);
+
+/**
+ * Removes an authentication information object.
+ * @param[in] lc The #LinphoneCore from which the #LinphoneAuthInfo will be removed.
+ * @param[in] info The #LinphoneAuthInfo to remove.
+ * @ingroup authentication
+ */
+LINPHONE_PUBLIC void linphone_core_remove_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *info);
+
+/**
+ * Returns an unmodifiable list of currently entered #LinphoneAuthInfo.
+ * @param[in] lc The #LinphoneCore object.
+ * @return \bctbx_list{LinphoneAuthInfo}
+ * @ingroup authentication
+ */
+LINPHONE_PUBLIC const bctbx_list_t *linphone_core_get_auth_info_list(const LinphoneCore *lc);
+
+/**
+ * Find authentication info matching realm, username, domain criteria.
+ * First of all, (realm,username) pair are searched. If multiple results (which should not happen because realm are supposed to be unique), then domain is added to the search.
+ * @param lc the #LinphoneCore
+ * @param realm the authentication 'realm' (optional)
+ * @param username the SIP username to be authenticated (mandatory)
+ * @param sip_domain the SIP domain name (optional)
+ * @return a #LinphoneAuthInfo
+ * @ingroup authentication
+**/
+LINPHONE_PUBLIC const LinphoneAuthInfo *linphone_core_find_auth_info(LinphoneCore *lc, const char *realm, const char *username, const char *sip_domain);
+
+/**
+ * This method is used to abort a user authentication request initiated by #LinphoneCore
+ * from the auth_info_requested callback of LinphoneCoreVTable.
+ * @note That function does nothing for now.
+**/
+LINPHONE_PUBLIC void linphone_core_abort_authentication(LinphoneCore *lc, LinphoneAuthInfo *info);
+
+/**
+ * Clear all authentication information.
+ * @ingroup authentication
+ **/
+LINPHONE_PUBLIC void linphone_core_clear_all_auth_info(LinphoneCore *lc);
+
+/**
+ * Sets an default account creator service in the core
+ * @param lc #LinphoneCore object
+ * @param cbs #LinphoneAccountCreatorService object
+**/
+LINPHONE_PUBLIC void linphone_core_set_account_creator_service(LinphoneCore *lc, LinphoneAccountCreatorService *service);
+
+/**
+ * Get default account creator service from the core
+ * @param lc #LinphoneCore object
+ * @return #LinphoneAccountCreatorService object
+**/
+LINPHONE_PUBLIC LinphoneAccountCreatorService * linphone_core_get_account_creator_service(LinphoneCore *lc);
+
+/**
+ * Enable or disable the audio adaptive jitter compensation.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] enable TRUE to enable the audio adaptive jitter compensation, FALSE to disable it.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_enable_audio_adaptive_jittcomp(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Tells whether the audio adaptive jitter compensation is enabled.
+ * @param[in] lc #LinphoneCore object
+ * @return TRUE if the audio adaptive jitter compensation is enabled, FALSE otherwise.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_audio_adaptive_jittcomp_enabled(LinphoneCore *lc);
+
+/**
+ * Returns the nominal audio jitter buffer size in milliseconds.
+ * @param[in] lc #LinphoneCore object
+ * @return The nominal audio jitter buffer size in milliseconds
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_audio_jittcomp(LinphoneCore *lc);
+
+/**
+ * Sets the nominal audio jitter buffer size in milliseconds.
+ * The value takes effect immediately for all running and pending calls, if any.
+ * A value of 0 disables the jitter buffer.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_audio_jittcomp(LinphoneCore *lc, int milliseconds);
+
+/**
+ * Enable or disable the video adaptive jitter compensation.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] enable TRUE to enable the video adaptive jitter compensation, FALSE to disable it.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_enable_video_adaptive_jittcomp(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Tells whether the video adaptive jitter compensation is enabled.
+ * @param[in] lc #LinphoneCore object
+ * @return TRUE if the video adaptive jitter compensation is enabled, FALSE otherwise.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_video_adaptive_jittcomp_enabled(LinphoneCore *lc);
+
+/**
+ * Returns the nominal video jitter buffer size in milliseconds.
+ * @param[in] lc #LinphoneCore object
+ * @return The nominal video jitter buffer size in milliseconds
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_video_jittcomp(LinphoneCore *lc);
+
+/**
+ * Sets the nominal video jitter buffer size in milliseconds.
+ * The value takes effect immediately for all running and pending calls, if any.
+ * A value of 0 disables the jitter buffer.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_video_jittcomp(LinphoneCore *lc, int milliseconds);
+
+/**
+ * Gets the UDP port used for audio streaming.
+ * @param[in] lc #LinphoneCore object
+ * @return The UDP port used for audio streaming
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_audio_port(const LinphoneCore *lc);
+
+/**
+ * Get the audio port range from which is randomly chosen the UDP port used for audio streaming.
+ * @param[in] lc #LinphoneCore object
+ * @param[out] min_port The lower bound of the audio port range being used
+ * @param[out] max_port The upper bound of the audio port range being used
+ * @ingroup network_parameters
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void linphone_core_get_audio_port_range(const LinphoneCore *lc, int *min_port, int *max_port);
+
+/**
+ * Get the audio port range from which is randomly chosen the UDP port used for audio streaming.
+ * @param[in] lc #LinphoneCore object
+ * @return a #LinphoneRange object
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC LinphoneRange *linphone_core_get_audio_ports_range(const LinphoneCore *lc);
+
+/**
+ * Gets the UDP port used for video streaming.
+ * @param[in] lc #LinphoneCore object
+ * @return The UDP port used for video streaming
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_video_port(const LinphoneCore *lc);
+
+/**
+ * Get the video port range from which is randomly chosen the UDP port used for video streaming.
+ * @param[in] lc #LinphoneCore object
+ * @param[out] min_port The lower bound of the video port range being used
+ * @param[out] max_port The upper bound of the video port range being used
+ * @ingroup network_parameters
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void linphone_core_get_video_port_range(const LinphoneCore *lc, int *min_port, int *max_port);
+
+/**
+ * Get the video port range from which is randomly chosen the UDP port used for video streaming.
+ * @param[in] lc #LinphoneCore object
+ * @return a #LinphoneRange object
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC LinphoneRange *linphone_core_get_video_ports_range(const LinphoneCore *lc);
+
+/**
+ * Gets the UDP port used for text streaming.
+ * @param[in] lc #LinphoneCore object
+ * @return The UDP port used for text streaming
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_text_port(const LinphoneCore *lc);
+
+/**
+ * Get the video port range from which is randomly chosen the UDP port used for text streaming.
+ * @param[in] lc #LinphoneCore object
+ * @param[out] min_port The lower bound of the text port range being used
+ * @param[out] max_port The upper bound of the text port range being used
+ * @ingroup network_parameters
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void linphone_core_get_text_port_range(const LinphoneCore *lc, int *min_port, int *max_port);
+
+/**
+ * Get the text port range from which is randomly chosen the UDP port used for text streaming.
+ * @param[in] lc #LinphoneCore object
+ * @return a #LinphoneRange object
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC LinphoneRange *linphone_core_get_text_ports_range(const LinphoneCore *lc);
+
+/**
+ * Gets the value of the no-rtp timeout.
+ *
+ * When no RTP or RTCP packets have been received for a while
+ * #LinphoneCore will consider the call is broken (remote end crashed or
+ * disconnected from the network), and thus will terminate the call.
+ * The no-rtp timeout is the duration above which the call is considered broken.
+ * @param[in] lc #LinphoneCore object
+ * @return The value of the no-rtp timeout in seconds
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_nortp_timeout(const LinphoneCore *lc);
+
+/**
+ * Sets the UDP port used for audio streaming.
+ * A value of -1 will request the system to allocate the local port randomly.
+ * This is recommended in order to avoid firewall warnings.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] port The UDP port to use for audio streaming
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_audio_port(LinphoneCore *lc, int port);
+
+/**
+ * Sets the UDP port range from which to randomly select the port used for audio streaming.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] min_port The lower bound of the audio port range to use
+ * @param[in] max_port The upper bound of the audio port range to use
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_audio_port_range(LinphoneCore *lc, int min_port, int max_port);
+
+/**
+ * Sets the UDP port used for video streaming.
+ * A value of -1 will request the system to allocate the local port randomly.
+ * This is recommended in order to avoid firewall warnings.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] port The UDP port to use for video streaming
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_video_port(LinphoneCore *lc, int port);
+
+/**
+ * Sets the UDP port range from which to randomly select the port used for video streaming.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] min_port The lower bound of the video port range to use
+ * @param[in] max_port The upper bound of the video port range to use
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_video_port_range(LinphoneCore *lc, int min_port, int max_port);
+
+/**
+ * Sets the UDP port used for text streaming.
+ * A value if -1 will request the system to allocate the local port randomly.
+ * This is recommended in order to avoid firewall warnings.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] port The UDP port to use for text streaming
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_text_port(LinphoneCore *lc, int port);
+
+/**
+ * Sets the UDP port range from which to randomly select the port used for text streaming.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] min_port The lower bound of the text port range to use
+ * @param[in] max_port The upper bound of the text port range to use
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_text_port_range(LinphoneCore *lc, int min_port, int max_port);
+
+/**
+ * Sets the no-rtp timeout value in seconds.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] seconds The no-rtp timeout value to use in seconds
+ * @ingroup media_parameters
+ * @see linphone_core_get_nortp_timeout() for details.
+**/
+LINPHONE_PUBLIC void linphone_core_set_nortp_timeout(LinphoneCore *lc, int seconds);
+
+/**
+ * Sets whether SIP INFO is to be used to send digits.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] use_info A boolean value telling whether to use SIP INFO to send digits
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_use_info_for_dtmf(LinphoneCore *lc, bool_t use_info);
+
+/**
+ * Indicates whether SIP INFO is used to send digits.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether SIP INFO is used to send digits
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_get_use_info_for_dtmf(LinphoneCore *lc);
+
+/**
+ * Sets whether RFC2833 is to be used to send digits.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] use_rfc2833 A boolean value telling whether to use RFC2833 to send digits
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_use_rfc2833_for_dtmf(LinphoneCore *lc,bool_t use_rfc2833);
+
+/**
+ * Indicates whether RFC2833 is used to send digits.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether RFC2833 is used to send digits
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_get_use_rfc2833_for_dtmf(LinphoneCore *lc);
+
+/**
+ * Sets the UDP port to be used by SIP.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] port The UDP port to be used by SIP
+ * @ingroup network_parameters
+ * @deprecated use linphone_core_set_sip_transports() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_sip_port(LinphoneCore *lc, int port);
+
+/**
+ * Gets the UDP port used by SIP.
+ * @param[in] lc #LinphoneCore object
+ * @return The UDP port used by SIP
+ * @ingroup network_parameters
+ * @deprecated use linphone_core_get_sip_transports() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_sip_port(LinphoneCore *lc);
+
+/**
+ * Sets the ports to be used for each of transport (UDP or TCP)
+ * A zero value port for a given transport means the transport
+ * is not used. A value of LC_SIP_TRANSPORT_RANDOM (-1) means the port is to be choosen randomly by the system.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] transports A #LinphoneSipTransports structure giving the ports to use
+ * @return 0
+ * @ingroup network_parameters
+ * @deprecated Use linphone_core_set_transports instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_sip_transports(LinphoneCore *lc, const LinphoneSipTransports *transports);
+
+/**
+ * Retrieves the port configuration used for each transport (udp, tcp, tls).
+ * A zero value port for a given transport means the transport
+ * is not used. A value of LC_SIP_TRANSPORT_RANDOM (-1) means the port is to be chosen randomly by the system.
+ * @param[in] lc #LinphoneCore object
+ * @param[out] transports A #LinphoneSipTransports structure that will receive the configured ports
+ * @return 0
+ * @ingroup network_parameters
+ * @deprecated
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_get_sip_transports(LinphoneCore *lc, LinphoneSipTransports *transports);
+
+/**
+ * Retrieves the real port number assigned for each sip transport (udp, tcp, tls).
+ * A zero value means that the transport is not activated.
+ * If LC_SIP_TRANSPORT_RANDOM was passed to linphone_core_set_sip_transports(), the random port choosed by the system is returned.
+ * @param[in] lc #LinphoneCore object
+ * @param[out] tr A #LinphoneSipTransports structure that will receive the ports being used
+ * @ingroup network_parameters
+ * @deprecated Use linphone_core_get_transports_used instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_core_get_sip_transports_used(LinphoneCore *lc, LinphoneSipTransports *tr);
+
+/**
+ * Sets the ports to be used for each of transport (UDP or TCP)
+ * A zero value port for a given transport means the transport
+ * is not used. A value of LC_SIP_TRANSPORT_RANDOM (-1) means the port is to be choosen randomly by the system.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] transports A #LinphoneSipTransports structure giving the ports to use
+ * @return 0
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_transports(LinphoneCore *lc, const LinphoneTransports *transports);
+
+/**
+ * Retrieves the port configuration used for each transport (udp, tcp, tls).
+ * A zero value port for a given transport means the transport
+ * is not used. A value of LC_SIP_TRANSPORT_RANDOM (-1) means the port is to be chosen randomly by the system.
+ * @param[in] lc #LinphoneCore object
+ * @return A #LinphoneTransports structure with the configured ports
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC LinphoneTransports *linphone_core_get_transports(LinphoneCore *lc);
+
+/**
+ * Retrieves the real port number assigned for each sip transport (udp, tcp, tls).
+ * A zero value means that the transport is not activated.
+ * If LC_SIP_TRANSPORT_RANDOM was passed to linphone_core_set_sip_transports(), the random port choosed by the system is returned.
+ * @param[in] lc #LinphoneCore object
+ * @return A #LinphoneTransports structure with the ports being used
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC LinphoneTransports *linphone_core_get_transports_used(LinphoneCore *lc);
+
+/**
+ * Increment refcount.
+ * @param[in] transports #LinphoneTransports object
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC LinphoneTransports *linphone_transports_ref(LinphoneTransports *transports);
+
+/**
+ * Decrement refcount and possibly free the object.
+ * @param[in] transports #LinphoneTransports object
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_transports_unref(LinphoneTransports *transports);
+
+/**
+ * Gets the user data in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports
+ * @return the user data
+ * @ingroup network_parameters
+*/
+LINPHONE_PUBLIC void *linphone_transports_get_user_data(const LinphoneTransports *transports);
+
+/**
+ * Sets the user data in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @param[in] data the user data
+ * @ingroup network_parameters
+*/
+LINPHONE_PUBLIC void linphone_transports_set_user_data(LinphoneTransports *transports, void *data);
+
+/**
+ * Gets the UDP port in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @return the UDP port
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC int linphone_transports_get_udp_port(const LinphoneTransports* transports);
+
+/**
+ * Gets the TCP port in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @return the TCP port
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC int linphone_transports_get_tcp_port(const LinphoneTransports* transports);
+
+/**
+ * Gets the TLS port in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @return the TLS port
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC int linphone_transports_get_tls_port(const LinphoneTransports* transports);
+
+/**
+ * Gets the DTLS port in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @return the DTLS port
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC int linphone_transports_get_dtls_port(const LinphoneTransports* transports);
+
+/**
+ * Sets the UDP port in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @param[in] port the UDP port
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_transports_set_udp_port(LinphoneTransports *transports, int port);
+
+/**
+ * Sets the TCP port in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @param[in] port the TCP port
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_transports_set_tcp_port(LinphoneTransports *transports, int port);
+
+/**
+ * Sets the TLS port in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @param[in] port the TLS port
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_transports_set_tls_port(LinphoneTransports *transports, int port);
+
+/**
+ * Sets the DTLS port in the #LinphoneTransports object
+ * @param[in] transports the #LinphoneTransports object
+ * @param[in] port the DTLS port
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_transports_set_dtls_port(LinphoneTransports *transports, int port);
+
+/**
+ * Tells whether the given transport type is supported by the library.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] tp #LinphoneTranportType to check for support
+ * @return A boolean value telling whether the given transport type is supported by the library
+**/
+LINPHONE_PUBLIC bool_t linphone_core_sip_transport_supported(const LinphoneCore *lc, LinphoneTransportType tp);
+
+LINPHONE_PUBLIC bool_t linphone_core_content_encoding_supported(const LinphoneCore *lc, const char *content_encoding);
+
+/**
+ * Give access to the UDP sip socket. Can be useful to configure this socket as persistent I.E kCFStreamNetworkServiceType set to kCFStreamNetworkServiceTypeVoIP)
+ * @param lc #LinphoneCore
+ * @return socket file descriptor
+ * @deprecated Deprecated since 2018-08
+ */
+LINPHONE_DEPRECATED ortp_socket_t linphone_core_get_sip_socket(LinphoneCore *lc);
+
+/**
+ * Set the incoming call timeout in seconds.
+ * If an incoming call isn't answered for this timeout period, it is
+ * automatically declined.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] seconds The new timeout in seconds
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC void linphone_core_set_inc_timeout(LinphoneCore *lc, int seconds);
+
+/**
+ * Returns the incoming call timeout
+ * See linphone_core_set_inc_timeout() for details.
+ * @param[in] lc #LinphoneCore object
+ * @return The current incoming call timeout in seconds
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC int linphone_core_get_inc_timeout(LinphoneCore *lc);
+
+/**
+ * Set the in call timeout in seconds.
+ * After this timeout period, the call is automatically hangup.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] seconds The new timeout in seconds
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC void linphone_core_set_in_call_timeout(LinphoneCore *lc, int seconds);
+
+/**
+ * Gets the in call timeout
+ * See linphone_core_set_in_call_timeout() for details.
+ * @param[in] lc #LinphoneCore object
+ * @return The current in call timeout in seconds
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC int linphone_core_get_in_call_timeout(LinphoneCore *lc);
+
+/**
+ * Set the in delayed timeout in seconds.
+ * After this timeout period, a delayed call (internal call initialisation or resolution) is resumed.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] seconds The new delayed timeout
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC void linphone_core_set_delayed_timeout(LinphoneCore *lc, int seconds);
+
+/**
+ * Gets the delayed timeout
+ * See linphone_core_set_delayed_timeout() for details.
+ * @param[in] lc #LinphoneCore object
+ * @return The current delayed timeout in seconds
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC int linphone_core_get_delayed_timeout(LinphoneCore *lc);
+
+/**
+ * Set the STUN server address to use when the firewall policy is set to STUN.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] server The STUN server address to use.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_stun_server(LinphoneCore *lc, const char *server);
+
+/**
+ * Get the STUN server address being used.
+ * @param[in] lc #LinphoneCore object
+ * @return The STUN server address being used.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC const char * linphone_core_get_stun_server(const LinphoneCore *lc);
+
+/**
+ * Return the availability of uPnP.
+ * @return true if uPnP is available otherwise return false.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_upnp_available(void);
+
+/**
+ * Return the internal state of uPnP.
+ * @param lc #LinphoneCore
+ * @return an LinphoneUpnpState.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC LinphoneUpnpState linphone_core_get_upnp_state(const LinphoneCore *lc);
+
+/**
+ * Return the external ip address of router.
+ * In some cases the uPnP can have an external ip address but not a usable uPnP
+ * (state different of Ok).
+ *
+ * @param lc #LinphoneCore
+ * @return a null terminated string containing the external ip address. If the
+ * the external ip address is not available return null.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC const char * linphone_core_get_upnp_external_ipaddress(const LinphoneCore *lc);
+
+/**
+ * Set the public IP address of NAT when using the firewall policy is set to use NAT.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] addr The public IP address of NAT to use.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_nat_address(LinphoneCore *lc, const char *addr);
+
+/**
+ * Get the public IP address of NAT being used.
+ * @param[in] lc #LinphoneCore object.
+ * @return The public IP address of NAT being used.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_nat_address(const LinphoneCore *lc);
+
+/**
+ * Set the policy to use to pass through firewalls.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] pol The #LinphoneFirewallPolicy to use.
+ * @ingroup network_parameters
+ * @deprecated Use linphone_core_set_nat_policy() instead.
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_core_set_firewall_policy(LinphoneCore *lc, LinphoneFirewallPolicy pol);
+
+/**
+ * Get the policy that is used to pass through firewalls.
+ * @param[in] lc #LinphoneCore object.
+ * @return The #LinphoneFirewallPolicy that is being used.
+ * @ingroup network_parameters
+ * @deprecated Use linphone_core_get_nat_policy() instead
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneFirewallPolicy linphone_core_get_firewall_policy(const LinphoneCore *lc);
+
+/**
+ * Set the policy to use to pass through NATs/firewalls.
+ * It may be overridden by a NAT policy for a specific proxy config.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] policy #LinphoneNatPolicy object
+ * @ingroup network_parameters
+ * @see linphone_proxy_config_set_nat_policy()
+ */
+LINPHONE_PUBLIC void linphone_core_set_nat_policy(LinphoneCore *lc, LinphoneNatPolicy *policy);
+
+/**
+ * Get The policy that is used to pass through NATs/firewalls.
+ * It may be overridden by a NAT policy for a specific proxy config.
+ * @param[in] lc #LinphoneCore object
+ * @return #LinphoneNatPolicy object in use.
+ * @ingroup network_parameters
+ * @see linphone_proxy_config_get_nat_policy()
+ */
+LINPHONE_PUBLIC LinphoneNatPolicy * linphone_core_get_nat_policy(const LinphoneCore *lc);
+
+/**
+ * Gets the list of the available sound devices.
+ * @param[in] lc #LinphoneCore object
+ * @return An unmodifiable array of strings contanining the names of the available sound devices that is NULL terminated
+ * @ingroup media_parameters
+ * @donotwrap
+ * @deprecated use linphone_core_get_sound_devices_list instead
+**/
+LINPHONE_PUBLIC const char** linphone_core_get_sound_devices(LinphoneCore *lc);
+
+/**
+ * Gets the list of the available sound devices.
+ * @param[in] lc #LinphoneCore object
+ * @return \bctbx_list{char *} An unmodifiable array of strings contanining the names of the available sound devices that is NULL terminated
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bctbx_list_t * linphone_core_get_sound_devices_list(const LinphoneCore *lc);
+
+/**
+ * Use this function when you want to set the default sound devices
+ **/
+LINPHONE_PUBLIC void linphone_core_set_default_sound_devices(LinphoneCore *lc);
+
+/**
+ * Update detection of sound devices.
+ *
+ * Use this function when the application is notified of USB plug events, so that
+ * list of available hardwares for sound playback and capture is updated.
+ * @param[in] lc #LinphoneCore object.
+ * @ingroup media_parameters
+ **/
+LINPHONE_PUBLIC void linphone_core_reload_sound_devices(LinphoneCore *lc);
+
+/**
+ * Tells whether a specified sound device can capture sound.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] device the device name as returned by linphone_core_get_sound_devices()
+ * @return A boolean value telling whether the specified sound device can capture sound
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_sound_device_can_capture(LinphoneCore *lc, const char *device);
+
+/**
+ * Tells whether a specified sound device can play sound.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] device the device name as returned by linphone_core_get_sound_devices()
+ * @return A boolean value telling whether the specified sound device can play sound
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_sound_device_can_playback(LinphoneCore *lc, const char *device);
+
+/**
+ * Get ring sound level in 0-100 scale.
+ * @ingroup media_parameters
+ * @deprecated
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_ring_level(LinphoneCore *lc);
+
+/**
+ * Get playback sound level in 0-100 scale.
+ * @ingroup media_parameters
+ * @deprecated
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_play_level(LinphoneCore *lc);
+
+/**
+ * Get sound capture level in 0-100 scale.
+ * @ingroup media_parameters
+ * @deprecated
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_rec_level(LinphoneCore *lc);
+
+/**
+ * Get sound media level in 0-100 scale.
+ * @ingroup media_parameters
+ * @deprecated
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_media_level(LinphoneCore *lc);
+
+/**
+ * Set sound ring level in 0-100 scale.
+ * @ingroup media_parameters
+ * @deprecated
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_ring_level(LinphoneCore *lc, int level);
+
+/**
+ * Set sound playback level in 0-100 scale.
+ * @deprecated
+ * @ingroup media_parameters
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_play_level(LinphoneCore *lc, int level);
+
+/**
+ * Set sound capture level in 0-100 scale.
+ * @deprecated
+ * @ingroup media_parameters
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_rec_level(LinphoneCore *lc, int level);
+
+/**
+ * Set sound media level in 0-100 scale.
+ * @deprecated
+ * @ingroup media_parameters
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_media_level(LinphoneCore *lc, int level);
+
+LINPHONE_DEPRECATED char linphone_core_get_sound_source(LinphoneCore *lc);
+
+LINPHONE_DEPRECATED void linphone_core_set_sound_source(LinphoneCore *lc, char source);
+
+/**
+ * Allow to control microphone level: gain in db.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] level The new microphone level
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_mic_gain_db(LinphoneCore *lc, float level);
+
+/**
+ * Get microphone gain in db.
+ * @param[in] lc #LinphoneCore object
+ * @return The current microphone gain
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC float linphone_core_get_mic_gain_db(LinphoneCore *lc);
+
+/**
+ * Allow to control play level before entering sound card:  gain in db
+ * @param[in] lc #LinphoneCore object
+ * @param[in] level The new play level
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_playback_gain_db(LinphoneCore *lc, float level);
+
+/**
+ * Get playback gain in db before entering  sound card.
+ * @param[in] lc #LinphoneCore object
+ * @return The current playback gain
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC float linphone_core_get_playback_gain_db(LinphoneCore *lc);
+
+/**
+ * Gets the name of the currently assigned sound device for ringing.
+ * @param[in] lc #LinphoneCore object
+ * @return The name of the currently assigned sound device for ringing
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char * linphone_core_get_ringer_device(LinphoneCore *lc);
+
+/**
+ * Gets the name of the currently assigned sound device for playback.
+ * @param[in] lc #LinphoneCore object
+ * @return The name of the currently assigned sound device for playback
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char * linphone_core_get_playback_device(LinphoneCore *lc);
+
+/**
+ * Gets the name of the currently assigned sound device for capture.
+ * @param[in] lc #LinphoneCore object
+ * @return The name of the currently assigned sound device for capture
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char * linphone_core_get_capture_device(LinphoneCore *lc);
+
+/**
+ * Gets the name of the currently assigned sound device for media.
+ * @param[in] lc #LinphoneCore object
+ * @return The name of the currently assigned sound device for capture
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char * linphone_core_get_media_device(LinphoneCore *lc);
+
+/**
+ * Sets the sound device used for ringing.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] devid The device name as returned by linphone_core_get_sound_devices()
+ * @return 0
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_ringer_device(LinphoneCore *lc, const char * devid);
+
+/**
+ * Sets the sound device used for playback.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] devid The device name as returned by linphone_core_get_sound_devices()
+ * @return 0
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_playback_device(LinphoneCore *lc, const char * devid);
+
+/**
+ * Sets the sound device used for capture.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] devid The device name as returned by linphone_core_get_sound_devices()
+ * @return 0
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_capture_device(LinphoneCore *lc, const char * devid);
+
+/**
+ * Sets the sound device used for media.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] devid The device name as returned by linphone_core_get_sound_devices()
+ * @return 0
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_media_device(LinphoneCore *lc, const char * devid);
+
+/**
+ * Whenever the liblinphone is playing a ring to advertise an incoming call or ringback of an outgoing call, this function stops
+ * the ringing. Typical use is to stop ringing when the user requests to ignore the call.
+ * @param[in] lc #LinphoneCore object
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_stop_ringing(LinphoneCore *lc);
+
+/**
+ * Sets the path to a wav file used for ringing. The file must be a wav 16bit linear. Local ring is disabled if null.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] path The path to a wav file to be used for ringing
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_ring(LinphoneCore *lc, const char *path);
+
+/**
+ * Returns the path to the wav file used for ringing.
+ * @param[in] lc #LinphoneCore object
+ * @return The path to the wav file used for ringing
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_ring(const LinphoneCore *lc);
+
+/**
+ * Specify whether the tls server certificate must be verified when connecting to a SIP/TLS server.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] yesno A boolean value telling whether the tls server certificate must be verified
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC void linphone_core_verify_server_certificates(LinphoneCore *lc, bool_t yesno);
+
+/**
+ * Specify whether the tls server certificate common name must be verified when connecting to a SIP/TLS server.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] yesno A boolean value telling whether the tls server certificate common name must be verified
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC void linphone_core_verify_server_cn(LinphoneCore *lc, bool_t yesno);
+
+/**
+ * Gets the path to a file or folder containing the trusted root CAs (PEM format)
+ * @param[in] lc #LinphoneCore object
+ * @return The path to a file or folder containing the trusted root CAs
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_root_ca(LinphoneCore *lc);
+
+/**
+ * Sets the path to a file or folder containing trusted root CAs (PEM format)
+ * @param[in] lc #LinphoneCore object
+ * @param[in] path The path to a file or folder containing trusted root CAs
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC void linphone_core_set_root_ca(LinphoneCore *lc, const char *path);
+
+/**
+ * Sets the trusted root CAs (PEM format)
+ * @param[in] lc #LinphoneCore object
+ * @param[in] data The trusted root CAs as a string
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC void linphone_core_set_root_ca_data(LinphoneCore *lc, const char *data);
+
+/**
+ * @internal
+ * Set the pointer to an externally provided ssl configuration for the crypto library
+ * @param lc #LinphoneCore object
+ * @param[in] ssl_config A pointer to an opaque structure which will be provided directly to the crypto library used in bctoolbox. Use with extra care.
+ * This ssl_config structure is responsibility of the caller and will not be freed at the connection's end.
+ * @ingroup initializing
+ * @endinternal
+ */
+LINPHONE_PUBLIC void linphone_core_set_ssl_config(LinphoneCore *lc, void *ssl_config);
+
+/**
+ * Sets the path to a wav file used for ringing back.
+ * Ringback means the ring that is heard when it's ringing at the remote party.
+ * The file must be a wav 16bit linear.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] path The path to a wav file to be used for ringing back
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_ringback(LinphoneCore *lc, const char *path);
+
+/**
+ * Returns the path to the wav file used for ringing back.
+ * @param[in] lc #LinphoneCore object
+ * @return The path to the wav file used for ringing back
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char * linphone_core_get_ringback(const LinphoneCore *lc);
+
+/**
+ * Specify a ring back tone to be played to far end during incoming calls.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] ring The path to the ring back tone to be played.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_remote_ringback_tone(LinphoneCore *lc, const char *ring);
+
+/**
+ * Get the ring back tone played to far end during incoming calls.
+ * @param[in] lc #LinphoneCore object
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_remote_ringback_tone(const LinphoneCore *lc);
+
+/**
+ * Enable or disable the ring play during an incoming early media call.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] enable A boolean value telling whether to enable ringing during an incoming early media call.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_ring_during_incoming_early_media(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Tells whether the ring play is enabled during an incoming early media call.
+ * @param[in] lc #LinphoneCore object
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_get_ring_during_incoming_early_media(const LinphoneCore *lc);
+
+LINPHONE_PUBLIC LinphoneStatus linphone_core_preview_ring(LinphoneCore *lc, const char *ring,LinphoneCoreCbFunc func,void * userdata);
+
+/**
+ * Returns the MSFactory (mediastreamer2 factory) used by the #LinphoneCore to control mediastreamer2 library.
+**/
+LINPHONE_PUBLIC MSFactory* linphone_core_get_ms_factory(LinphoneCore* lc);
+
+/**
+ * Plays an audio file to the local user.
+ * This function works at any time, during calls, or when no calls are running.
+ * It doesn't request the underlying audio system to support multiple playback streams.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] audiofile The path to an audio file in wav PCM 16 bit format
+ * @return 0 on success, -1 on error
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_play_local(LinphoneCore *lc, const char *audiofile);
+
+/**
+ * Enables or disable echo cancellation. Value is saved and used for subsequent calls.
+ * This actually controls software echo cancellation. If hardware echo cancellation is available,
+ * it will be always used and activated for calls, regardless of the value passed to this function.
+ * When hardware echo cancellation is available, the software one is of course not activated.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] val A boolean value telling whether echo cancellation is to be enabled or disabled.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_echo_cancellation(LinphoneCore *lc, bool_t val);
+
+/**
+ * Returns TRUE if echo cancellation is enabled.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether echo cancellation is enabled or disabled
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_echo_cancellation_enabled(const LinphoneCore *lc);
+
+/**
+ * Enables or disable echo limiter.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] val TRUE to enable echo limiter, FALSE to disable it.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_echo_limiter(LinphoneCore *lc, bool_t val);
+
+/**
+ * Tells whether echo limiter is enabled.
+ * @param[in] lc #LinphoneCore object.
+ * @return TRUE if the echo limiter is enabled, FALSE otherwise.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_echo_limiter_enabled(const LinphoneCore *lc);
+
+void linphone_core_enable_agc(LinphoneCore *lc, bool_t val);
+
+bool_t linphone_core_agc_enabled(const LinphoneCore *lc);
+
+/**
+ * @deprecated Use #linphone_core_enable_mic instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_mute_mic(LinphoneCore *lc, bool_t muted);
+
+/**
+ * Get mic state.
+ * @deprecated Use #linphone_core_mic_enabled instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_core_is_mic_muted(LinphoneCore *lc);
+
+/**
+ * Enable or disable the microphone.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] enable TRUE to enable the microphone, FALSE to disable it.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_mic(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Tells whether the microphone is enabled.
+ * @param[in] lc #LinphoneCore object
+ * @return TRUE if the microphone is enabled, FALSE if disabled.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_mic_enabled(LinphoneCore *lc);
+
+/**
+ * Returns the RTP transmission status for an active stream.
+ * If audio is muted and config parameter rtp_no_xmit_on_audio_mute
+ * has been set on then the RTP transmission is also muted.
+ * @param lc The #LinphoneCore.
+ * @return TRUE if the RTP transmisison is muted.
+ */
+LINPHONE_PUBLIC bool_t linphone_core_is_rtp_muted(LinphoneCore *lc);
+
+LINPHONE_PUBLIC bool_t linphone_core_get_rtp_no_xmit_on_audio_mute(const LinphoneCore *lc);
+
+LINPHONE_PUBLIC void linphone_core_set_rtp_no_xmit_on_audio_mute(LinphoneCore *lc, bool_t val);
+
+
+/*******************************************************************************
+ * Call log related functions                                                  *
+ ******************************************************************************/
+
+/**
+ * @addtogroup call_logs
+ * @{
+**/
+
+/**
+ * Get the list of call logs (past calls).
+ * @param[in] lc #LinphoneCore object
+ * @return \bctbx_list{LinphoneCallLog}
+**/
+LINPHONE_PUBLIC const bctbx_list_t * linphone_core_get_call_logs(LinphoneCore *lc);
+
+/**
+ * Get the list of call logs (past calls) that matches the given #LinphoneAddress.
+ * At the contrary of linphone_core_get_call_logs, it is your responsibility to unref the logs and free this list once you are done using it.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] addr #LinphoneAddress object
+ * @return \bctbx_list{LinphoneCallLog} \onTheFlyList
+ * @deprecated Use #linphone_core_get_call_history_2 instead. Deprecated since 2018-10-29.
+**/
+LINPHONE_PUBLIC bctbx_list_t * linphone_core_get_call_history_for_address(LinphoneCore *lc, const LinphoneAddress *addr);
+
+/**
+ * Get the list of call logs (past calls).
+ * At the contrary of linphone_core_get_call_logs, it is your responsibility to unref the logs and free this list once you are done using it.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] peer_addr A #LinphoneAddress object.
+ * @return \bctbx_list{LinphoneCallLog} \onTheFlyList
+**/
+LINPHONE_PUBLIC bctbx_list_t *linphone_core_get_call_history_2(
+	LinphoneCore *lc,
+	const LinphoneAddress *peer_addr,
+	const LinphoneAddress *local_addr
+);
+
+/**
+ * Get the latest outgoing call log.
+ * @param[in] lc #LinphoneCore object
+ * @return {LinphoneCallLog}
+**/
+LINPHONE_PUBLIC LinphoneCallLog * linphone_core_get_last_outgoing_call_log(LinphoneCore *lc);
+
+/**
+ * Get the call log matching the call id, or NULL if can't be found.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call_id Call id of the call log to find
+ * @return {LinphoneCallLog}
+**/
+LINPHONE_PUBLIC LinphoneCallLog * linphone_core_find_call_log_from_call_id(LinphoneCore *lc, const char *call_id);
+
+/**
+ * Erase the call log.
+ * @param[in] lc #LinphoneCore object
+**/
+LINPHONE_PUBLIC void linphone_core_clear_call_logs(LinphoneCore *lc);
+
+/**
+ * Get the number of missed calls.
+ * Once checked, this counter can be reset with linphone_core_reset_missed_calls_count().
+ * @param[in] lc #LinphoneCore object.
+ * @return The number of missed calls.
+**/
+LINPHONE_PUBLIC int linphone_core_get_missed_calls_count(LinphoneCore *lc);
+
+/**
+ * Reset the counter of missed calls.
+ * @param[in] lc #LinphoneCore object.
+**/
+LINPHONE_PUBLIC void linphone_core_reset_missed_calls_count(LinphoneCore *lc);
+
+/**
+ * Remove a specific call log from call history list.
+ * This function destroys the call log object. It must not be accessed anymore by the application after calling this function.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] call_log #LinphoneCallLog object to remove.
+**/
+LINPHONE_PUBLIC void linphone_core_remove_call_log(LinphoneCore *lc, LinphoneCallLog *call_log);
+
+/**
+ * Sets the database filename where call logs will be stored.
+ * If the file does not exist, it will be created.
+ * @ingroup initializing
+ * @param lc the linphone core
+ * @param path filesystem path
+**/
+LINPHONE_PUBLIC void linphone_core_set_call_logs_database_path(LinphoneCore *lc, const char *path);
+
+/**
+ * Gets the database filename where call logs will be stored.
+ * @ingroup initializing
+ * @param lc the linphone core
+ * @return filesystem path
+**/
+LINPHONE_PUBLIC const char * linphone_core_get_call_logs_database_path(LinphoneCore *lc);
+
+/**
+ * Migrates the call logs from the linphonerc to the database if not done yet
+ * @ingroup initializing
+ * @param lc the linphone core
+**/
+LINPHONE_PUBLIC void linphone_core_migrate_logs_from_rc_to_db(LinphoneCore *lc);
+
+/**
+ * @}
+**/
+
+/**
+ * Tells whether VCARD support is builtin.
+ * @return TRUE if VCARD is supported, FALSE otherwise.
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC bool_t linphone_core_vcard_supported(void);
+
+/**
+ * Test if video is supported
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC bool_t linphone_core_video_supported(LinphoneCore *lc);
+
+/**
+ * Enables video globally.
+ *
+ * This function does not have any effect during calls. It just indicates #LinphoneCore to
+ * initiate future calls with video or not. The two boolean parameters indicate in which
+ * direction video is enabled. Setting both to false disables video entirely.
+ *
+ * @param lc The #LinphoneCore object
+ * @param vcap_enabled indicates whether video capture is enabled
+ * @param display_enabled indicates whether video display should be shown
+ * @ingroup media_parameters
+ * @deprecated Use #linphone_core_enable_video_capture and #linphone_core_enable_video_display instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_enable_video(LinphoneCore *lc, bool_t vcap_enabled, bool_t display_enabled);
+
+/**
+ * Returns TRUE if either capture or display is enabled, FALSE otherwise.
+ * same as  ( #linphone_core_video_capture_enabled | #linphone_core_video_display_enabled )
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC  bool_t linphone_core_video_enabled(LinphoneCore *lc);
+
+/**
+ * Enable or disable video capture.
+ *
+ * This function does not have any effect during calls. It just indicates the #LinphoneCore to
+ * initiate future calls with video capture or not.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] enable TRUE to enable video capture, FALSE to disable it.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_video_capture(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Enable or disable video display.
+ *
+ * This function does not have any effect during calls. It just indicates the #LinphoneCore to
+ * initiate future calls with video display or not.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] enable TRUE to enable video display, FALSE to disable it.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_video_display(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Enable or disable video source reuse when switching from preview to actual video call.
+ *
+ * This source reuse is useful when you always display the preview, even before calls are initiated.
+ * By keeping the video source for the transition to a real video call, you will smooth out the
+ * source close/reopen cycle.
+ *
+ * This function does not have any effect durfing calls. It just indicates the #LinphoneCore to
+ * initiate future calls with video source reuse or not.
+ * Also, at the end of a video call, the source will be closed whatsoever for now.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] enable TRUE to enable video source reuse. FALSE to disable it for subsequent calls.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_enable_video_source_reuse(LinphoneCore* lc, bool_t enable);
+
+/**
+ * Tells whether video capture is enabled.
+ * @param[in] lc #LinphoneCore object.
+ * @return TRUE if video capture is enabled, FALSE if disabled.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_video_capture_enabled(LinphoneCore *lc);
+
+/**
+ * Tells whether video display is enabled.
+ * @param[in] lc #LinphoneCore object.
+ * @return TRUE if video display is enabled, FALSE if disabled.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_video_display_enabled(LinphoneCore *lc);
+
+/**
+ * Sets the default policy for video.
+ * This policy defines whether:
+ * - video shall be initiated by default for outgoing calls
+ * - video shall be accepter by default for incoming calls
+ *
+ * @param[in] lc #LinphoneCore object
+ * @param[in] policy The video policy to use
+ * @ingroup media_parameters
+ * @deprecated Deprecated since 2017-04-19. Use linphone_video_activation_policy_set_automatically_accept instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_video_policy(LinphoneCore *lc, const LinphoneVideoPolicy *policy);
+
+/**
+ * Get the default policy for video.
+ * See linphone_core_set_video_policy() for more details.
+ * @param[in] lc #LinphoneCore object
+ * @return The video policy being used
+ * @ingroup media_parameters
+ * @deprecated Deprecated since 2017-04-19. Use linphone_video_activation_policy_get_automatically_accept instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const LinphoneVideoPolicy *linphone_core_get_video_policy(const LinphoneCore *lc);
+
+/**
+ * Increment refcount.
+ * @param[in] policy #LinphoneVideoActivationPolicy object
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneVideoActivationPolicy *linphone_video_activation_policy_ref(LinphoneVideoActivationPolicy *policy);
+
+/**
+ * Decrement refcount and possibly free the object.
+ * @param[in] policy #LinphoneVideoActivationPolicy object
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_video_activation_policy_unref(LinphoneVideoActivationPolicy *policy);
+
+/**
+ * Gets the user data in the #LinphoneVideoActivationPolicy object
+ * @param[in] policy the #LinphoneVideoActivationPolicy
+ * @return the user data
+ * @ingroup media_parameters
+*/
+LINPHONE_PUBLIC void *linphone_video_activation_policy_get_user_data(const LinphoneVideoActivationPolicy *policy);
+
+/**
+ * Sets the user data in the #LinphoneVideoActivationPolicy object
+ * @param[in] policy the #LinphoneVideoActivationPolicy object
+ * @param[in] data the user data
+ * @ingroup media_parameters
+*/
+LINPHONE_PUBLIC void linphone_video_activation_policy_set_user_data(LinphoneVideoActivationPolicy *policy, void *data);
+
+/**
+ * Gets the value for the automatically accept video policy
+ * @param[in] policy the #LinphoneVideoActivationPolicy object
+ * @return whether or not to automatically accept video requests is enabled
+ * @ingroup media_parameters
+*/
+LINPHONE_PUBLIC bool_t linphone_video_activation_policy_get_automatically_accept(const LinphoneVideoActivationPolicy *policy);
+
+/**
+ * Gets the value for the automatically initiate video policy
+ * @param[in] policy the #LinphoneVideoActivationPolicy object
+ * @return whether or not to automatically initiate video calls is enabled
+ * @ingroup media_parameters
+*/
+LINPHONE_PUBLIC bool_t linphone_video_activation_policy_get_automatically_initiate(const LinphoneVideoActivationPolicy *policy);
+
+/**
+ * Sets the value for the automatically accept video policy
+ * @param[in] policy the #LinphoneVideoActivationPolicy object
+ * @param[in] enable whether or not to enable automatically accept video requests
+ * @ingroup media_parameters
+*/
+LINPHONE_PUBLIC void linphone_video_activation_policy_set_automatically_accept(LinphoneVideoActivationPolicy *policy, bool_t enable);
+
+/**
+ * Sets the value for the automatically initiate video policy
+ * @param[in] policy the #LinphoneVideoActivationPolicy object
+ * @param[in] enable whether or not to enable automatically initiate video calls
+ * @ingroup media_parameters
+*/
+LINPHONE_PUBLIC void linphone_video_activation_policy_set_automatically_initiate(LinphoneVideoActivationPolicy *policy, bool_t enable);
+
+/**
+ * Sets the default policy for video.
+ * This policy defines whether:
+ * - video shall be initiated by default for outgoing calls
+ * - video shall be accepted by default for incoming calls
+ * @param[in] lc #LinphoneCore object
+ * @param[in] policy The video policy to use
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_video_activation_policy(LinphoneCore *lc, const LinphoneVideoActivationPolicy *policy);
+
+/**
+ * Get the default policy for video.
+ * See linphone_core_set_video_activation_policy() for more details.
+ * @param[in] lc #LinphoneCore object
+ * @return The video policy being used
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneVideoActivationPolicy *linphone_core_get_video_activation_policy(const LinphoneCore *lc);
+
+/**
+ * @brief Returns the zero terminated table of supported video resolutions.
+ * @ingroup media_parameters
+ * @deprecated Use #linphone_factory_get_supported_video_definitions() instead. Deprecated since 2017-03-28.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const MSVideoSizeDef *linphone_core_get_supported_video_sizes(LinphoneCore *lc);
+
+/**
+ * Set the preferred video definition for the stream that is captured and sent to the remote party.
+ * All standard video definitions are accepted on the receive path.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_preferred_video_definition(LinphoneCore *lc, LinphoneVideoDefinition *vdef);
+
+/**
+ * @brief Sets the preferred video size.
+ *
+ * This applies only to the stream that is captured and sent to the remote party,
+ * since we accept all standard video size on the receive path.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_core_set_preferred_video_definition() instead. Deprecated since 2017-03-28.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_preferred_video_size(LinphoneCore *lc, MSVideoSize vsize);
+
+/**
+ * Set the video definition for the captured (preview) video.
+ * This method is for advanced usage where a video capture must be set independently of the definition of the stream actually sent through the call.
+ * This allows for example to have the preview window in High Definition  even if due to bandwidth constraint the sent video definition is small.
+ * Using this feature increases the CPU consumption, since a rescaling will be done internally.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_preview_video_definition(LinphoneCore *lc, LinphoneVideoDefinition *vdef);
+
+/**
+ * @brief Sets the video size for the captured (preview) video.
+ *
+ * This method is for advanced usage where a video capture must be set independently of the size of the stream actually sent through the call.
+ * This allows for example to have the preview window with HD resolution even if due to bandwidth constraint the sent video size is small.
+ * Using this feature increases the CPU consumption, since a rescaling will be done internally.
+ * @ingroup media_parameters
+ * @param lc the linphone core
+ * @param vsize the video resolution choosed for capuring and previewing. It can be (0,0) to not request any specific preview size and let the core optimize the processing.
+ * @deprecated Use #linphone_core_set_preview_video_definition() instead. Deprecated since 2017-03-28.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_preview_video_size(LinphoneCore *lc, MSVideoSize vsize);
+
+/**
+ * Sets the preview video size by its name. See linphone_core_set_preview_video_size() for more information about this feature.
+ *
+ * Video resolution names are: qcif, svga, cif, vga, 4cif, svga ...
+ * @ingroup media_parameters
+ * @deprecated Use linphone_factory_create_video_definition_from_name() and linphone_core_set_preview_video_definition() instead
+**/
+LINPHONE_PUBLIC void linphone_core_set_preview_video_size_by_name(LinphoneCore *lc, const char *name);
+
+/**
+ * Get the definition of the captured video.
+ * @param[in] lc #LinphoneCore object
+ * @return The captured #LinphoneVideoDefinition if it was previously set by linphone_core_set_preview_video_definition(), otherwise a 0x0 LinphoneVideoDefinition.
+ * @see linphone_core_set_preview_video_definition()
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC const LinphoneVideoDefinition * linphone_core_get_preview_video_definition(const LinphoneCore *lc);
+
+/**
+ * @brief Returns video size for the captured video if it was previously set by #linphone_core_set_preview_video_size(), otherwise returns a 0,0 size.
+ * @see #linphone_core_set_preview_video_size()
+ * @ingroup media_parameters
+ * @param lc the core
+ * @return a #MSVideoSize
+ * @deprecated Use #linphone_core_get_preview_video_definition() instead. Since 2017-03-28.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED MSVideoSize linphone_core_get_preview_video_size(const LinphoneCore *lc);
+
+/**
+ * Get the effective video definition provided by the camera for the captured video.
+ * When preview is disabled or not yet started this function returns a 0x0 video definition.
+ * @param[in] lc #LinphoneCore object
+ * @return The captured #LinphoneVideoDefinition
+ * @ingroup media_parameters
+ * @see linphone_core_set_preview_video_definition()
+ */
+LINPHONE_PUBLIC LinphoneVideoDefinition * linphone_core_get_current_preview_video_definition(const LinphoneCore *lc);
+
+/**
+ * @brief Returns the effective video size for the captured video as provided by the camera.
+ *
+ * When preview is disabled or not yet started, this function returns a zeroed video size.
+ * @see #linphone_core_set_preview_video_size()
+ * @ingroup media_parameters
+ * @param lc the core
+ * @return a #MSVideoSize
+ * @deprecated Use #linphone_core_get_current_preview_video_definition() instead. Deprecated since 2017-03-28.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED MSVideoSize linphone_core_get_current_preview_video_size(const LinphoneCore *lc);
+
+/**
+ * Get the preferred video definition for the stream that is captured and sent to the remote party.
+ * @param[in] lc #LinphoneCore object
+ * @return The preferred #LinphoneVideoDefinition
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC const LinphoneVideoDefinition * linphone_core_get_preferred_video_definition(const LinphoneCore *lc);
+
+/**
+ * @brief Returns the current preferred video size for sending.
+ * @ingroup media_parameters
+ * @deprecated Use linphone_core_get_preferred_video_definition() instead. Deprecated since 2017-03-28.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED MSVideoSize linphone_core_get_preferred_video_size(const LinphoneCore *lc);
+
+/**
+ * Get the name of the current preferred video size for sending.
+ * @param[in] lc #LinphoneCore object.
+ * @return A string containing the name of the current preferred video size (to be freed with ms_free()).
+ * @deprecated Use linphone_core_get_preferred_video_defintion() and linphone_video_definition_get_name() instead
+ */
+LINPHONE_PUBLIC char * linphone_core_get_preferred_video_size_name(const LinphoneCore *lc);
+
+/**
+ * Sets the preferred video size by its name.
+ *
+ * This is identical to linphone_core_set_preferred_video_size() except
+ * that it takes the name of the video resolution as input.
+ * Video resolution names are: qcif, svga, cif, vga, 4cif, svga ...
+ * @ingroup media_parameters
+ * @deprecated Use linphone_factory_create_video_definition_from_name() and linphone_core_set_preferred_video_definition() instead
+**/
+LINPHONE_PUBLIC void linphone_core_set_preferred_video_size_by_name(LinphoneCore *lc, const char *name);
+
+/**
+ * Set the preferred frame rate for video.
+ * Based on the available bandwidth constraints and network conditions, the video encoder
+ * remains free to lower the framerate. There is no warranty that the preferred frame rate be the actual framerate.
+ * used during a call. Default value is 0, which means "use encoder's default fps value".
+ * @param lc the #LinphoneCore
+ * @param fps the target frame rate in number of frames per seconds.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_preferred_framerate(LinphoneCore *lc, float fps);
+
+/**
+ * Returns the preferred video framerate, previously set by linphone_core_set_preferred_framerate().
+ * @param lc the linphone core
+ * @return frame rate in number of frames per seconds.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC float linphone_core_get_preferred_framerate(LinphoneCore *lc);
+
+/**
+ * Call generic OpenGL render for a given core.
+ * @param lc The core.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_preview_ogl_render(const LinphoneCore *lc);
+
+/**
+ * Controls video preview enablement.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] val A boolean value telling whether the video preview is to be shown
+ * Video preview refers to the action of displaying the local webcam image
+ * to the user while not in call.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_video_preview(LinphoneCore *lc, bool_t val);
+
+/**
+ * Tells whether video preview is enabled.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether video preview is enabled
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_video_preview_enabled(const LinphoneCore *lc);
+
+/**
+ * Controls QRCode enablement.
+ * @param[in] lc LinphoneCore object
+ * @param[in] val A boolean value telling whether the QRCode is enabled in the preview.
+ * @ingroup media_parameters
+ **/
+LINPHONE_PUBLIC void linphone_core_enable_qrcode_video_preview(LinphoneCore *lc, bool_t val);
+
+/**
+ * Set the rectangle where the decoder will search a QRCode
+ * @param[in] lc LinphoneCore* object
+ * @param[in] x axis
+ * @param[in] y axis
+ * @param[in] w width
+ * @param[in] h height
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_qrcode_decode_rect(LinphoneCore *lc, const int x, const int y, const int w, const int h);
+
+/**
+ * Tells whether QRCode is enabled in the preview.
+ * @param[in] lc LinphoneCore object
+ * @return A boolean value telling whether QRCode is enabled in the preview.
+ * @ingroup media_parameters
+ **/
+LINPHONE_PUBLIC bool_t linphone_core_qrcode_video_preview_enabled(const LinphoneCore *lc);
+
+/**
+ * Take a photo of currently from capture device and write it into a jpeg file.
+ * Note that the snapshot is asynchronous, an application shall not assume that the file is created when the function returns.
+ * @ingroup misc
+ * @param lc the linphone core
+ * @param file a path where to write the jpeg content.
+ * @return 0 if successfull, -1 otherwise (typically if jpeg format is not supported).
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_take_preview_snapshot(LinphoneCore *lc, const char *file);
+
+/**
+ * Enables or disable self view during calls.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] val A boolean value telling whether to enable self view
+ * Self-view refers to having local webcam image inserted in corner
+ * of the video window during calls.
+ * This function works at any time, including during calls.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_self_view(LinphoneCore *lc, bool_t val);
+
+/**
+ * Tells whether video self view during call is enabled or not.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether self view is enabled
+ * @see linphone_core_enable_self_view() for details.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_self_view_enabled(const LinphoneCore *lc);
+
+/**
+ * Update detection of camera devices.
+ *
+ * Use this function when the application is notified of USB plug events, so that
+ * list of available hardwares for video capture is updated.
+ * @param[in] lc #LinphoneCore object.
+ * @ingroup media_parameters
+ **/
+LINPHONE_PUBLIC void linphone_core_reload_video_devices(LinphoneCore *lc);
+
+/**
+ * Gets the list of the available video capture devices.
+ * @param[in] lc #LinphoneCore object
+ * @return An unmodifiable array of strings contanining the names of the available video capture devices that is NULL terminated
+ * @ingroup media_parameters
+ * @deprecated use linphone_core_get_video_devices_list instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC const char**  linphone_core_get_video_devices(const LinphoneCore *lc);
+
+/**
+ * Gets the list of the available video capture devices.
+ * @param[in] lc #LinphoneCore object
+ * @return \bctbx_list{char *} An unmodifiable array of strings contanining the names of the available video capture devices that is NULL terminated
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bctbx_list_t * linphone_core_get_video_devices_list(const LinphoneCore *lc);
+
+/**
+ * Sets the active video device.
+ * @param[in] lc #LinphoneCore object
+ * @param id The name of the video device to use as returned by linphone_core_get_video_devices()
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_video_device(LinphoneCore *lc, const char *id);
+
+/**
+ * Returns the name of the currently active video device.
+ * @param[in] lc #LinphoneCore object
+ * @return The name of the currently active video device
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_video_device(const LinphoneCore *lc);
+
+/**
+ * Set the path to the image file to stream when "Static picture" is set as the video device.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] path The path to the image file to use.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_static_picture(LinphoneCore *lc, const char *path);
+
+/**
+ * Get the path to the image file streamed when "Static picture" is set as the video device.
+ * @param[in] lc #LinphoneCore object.
+ * @return The path to the image file streamed when "Static picture" is set as the video device.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_static_picture(LinphoneCore *lc);
+
+/**
+ * Set the frame rate for static picture.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] fps The new frame rate to use for static picture.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_static_picture_fps(LinphoneCore *lc, float fps);
+
+/**
+ * Get the frame rate for static picture
+ * @param[in] lc #LinphoneCore object.
+ * @return The frame rate used for static picture.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC float linphone_core_get_static_picture_fps(LinphoneCore *lc);
+
+/**
+ * Get the native window handle of the video window.
+ * @param[in] lc #LinphoneCore object
+ * @return The native window handle of the video window
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void * linphone_core_get_native_video_window_id(const LinphoneCore *lc);
+
+/**
+ * @ingroup media_parameters
+ * For MacOS, Linux, Windows: core will create its own window
+ */
+#define LINPHONE_VIDEO_DISPLAY_AUTO (void*)((unsigned long) 0)
+
+/**
+ * @ingroup media_parameters
+ * For MacOS, Linux, Windows: do nothing
+ */
+#define LINPHONE_VIDEO_DISPLAY_NONE (void*)((unsigned long) -1)
+
+/**
+ * @ingroup media_parameters
+ * Set the native video window id where the video is to be displayed.
+ * For MacOS, Linux, Windows: if not set or LINPHONE_VIDEO_DISPLAY_AUTO the core will create its own window, unless the special id LINPHONE_VIDEO_DISPLAY_NONE is given.
+**/
+LINPHONE_PUBLIC void linphone_core_set_native_video_window_id(LinphoneCore *lc, void *id);
+
+/**
+ * Get the native window handle of the video preview window.
+ * @param[in] lc #LinphoneCore object
+ * @return The native window handle of the video preview window
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void * linphone_core_get_native_preview_window_id(const LinphoneCore *lc);
+
+/**
+ * Set the native window id where the preview video (local camera) is to be displayed.
+ * This has to be used in conjonction with linphone_core_use_preview_window().
+ * MacOS, Linux, Windows: if not set or zero the core will create its own window, unless the special id -1 is given.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] id The native window id where the preview video is to be displayed
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_native_preview_window_id(LinphoneCore *lc, void *id);
+
+/**
+ * Tells the core to use a separate window for local camera preview video, instead of
+ * inserting local view within the remote video window.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] yesno TRUE to use a separate window, FALSE to insert the preview in the remote video window.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_use_preview_window(LinphoneCore *lc, bool_t yesno);
+
+/**
+ * Gets the current device orientation.
+ * @param[in] lc #LinphoneCore object
+ * @return The current device orientation
+ * @ingroup media_parameters
+ * @see linphone_core_set_device_rotation()
+ */
+LINPHONE_PUBLIC int linphone_core_get_device_rotation(LinphoneCore *lc);
+
+/**
+ * Tells the core the device current orientation. This can be used by capture filters
+ * on mobile devices to select between portrait/landscape mode and to produce properly
+ * oriented images. The exact meaning of the value in rotation if left to each device
+ * specific implementations.
+ * IOS supported values are 0 for UIInterfaceOrientationPortrait and 270 for UIInterfaceOrientationLandscapeRight.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] rotation The orientation to use
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_device_rotation(LinphoneCore *lc, int rotation);
+
+/**
+ * Get the camera sensor rotation.
+ *
+ * This is needed on some mobile platforms to get the number of degrees the camera sensor
+ * is rotated relative to the screen.
+ * @param lc The linphone core related to the operation
+ * @ingroup media_parameters
+ * @return The camera sensor rotation in degrees (0 to 360) or -1 if it could not be retrieved
+ */
+LINPHONE_PUBLIC int linphone_core_get_camera_sensor_rotation(LinphoneCore *lc);
+
+/**
+ * Start or stop streaming video in case of embedded window.
+ * Can be used to disable video showing to free XV port
+**/
+void linphone_core_show_video(LinphoneCore *lc, bool_t show);
+
+/** @deprecated Use linphone_core_set_use_files() instead. */
+#define linphone_core_use_files(lc, yesno) linphone_core_set_use_files(lc, yesno)
+
+/**
+ * Ask the core to stream audio from and to files, instead of using the soundcard.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] yesno A boolean value asking to stream audio from and to files or not.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_use_files(LinphoneCore *lc, bool_t yesno);
+
+/**
+ * Gets whether linphone is currently streaming audio from and to files, rather
+ * than using the soundcard.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value representing whether linphone is streaming audio from and to files or not.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_get_use_files(LinphoneCore *lc);
+
+/**
+ * Get the wav file that is played when putting somebody on hold,
+ * or when files are used instead of soundcards (see linphone_core_set_use_files()).
+ *
+ * The file is a 16 bit linear wav file.
+ * @param[in] lc #LinphoneCore object
+ * @return The path to the file that is played when putting somebody on hold.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC const char * linphone_core_get_play_file(const LinphoneCore *lc);
+
+/**
+ * Sets a wav file to be played when putting somebody on hold,
+ * or when files are used instead of soundcards (see linphone_core_set_use_files()).
+ *
+ * The file must be a 16 bit linear wav file.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] file The path to the file to be played when putting somebody on hold.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_play_file(LinphoneCore *lc, const char *file);
+
+/**
+ * Get the wav file where incoming stream is recorded,
+ * when files are used instead of soundcards (see linphone_core_set_use_files()).
+ *
+ * This feature is different from call recording (linphone_call_params_set_record_file())
+ * The file is a 16 bit linear wav file.
+ * @param[in] lc #LinphoneCore object
+ * @return The path to the file where incoming stream is recorded.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char * linphone_core_get_record_file(const LinphoneCore *lc);
+
+/**
+ * Sets a wav file where incoming stream is to be recorded,
+ * when files are used instead of soundcards (see linphone_core_set_use_files()).
+ *
+ * This feature is different from call recording (linphone_call_params_set_record_file())
+ * The file will be a 16 bit linear wav file.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] file The path to the file where incoming stream is to be recorded.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_record_file(LinphoneCore *lc, const char *file);
+
+/**
+ * Plays a dtmf sound to the local user.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] dtmf DTMF to play ['0'..'16'] | '#' | '#'
+ * @param[in] duration_ms Duration in ms, -1 means play until next further call to #linphone_core_stop_dtmf()
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_play_dtmf(LinphoneCore *lc, char dtmf, int duration_ms);
+
+/**
+ * Stops playing a dtmf started by linphone_core_play_dtmf().
+ * @param[in] lc #LinphoneCore object
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_stop_dtmf(LinphoneCore *lc);
+
+LINPHONE_PUBLIC int linphone_core_get_current_call_duration(const LinphoneCore *lc);
+
+/**
+ * Returns the maximum transmission unit size in bytes.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_mtu(const LinphoneCore *lc);
+
+/**
+ * Sets the maximum transmission unit size in bytes.
+ * This information is useful for sending RTP packets.
+ * Default value is 1500.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] mtu The MTU in bytes
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_mtu(LinphoneCore *lc, int mtu);
+
+/**
+ * This method is called by the application to notify the linphone core library when network is reachable.
+ * Calling this method with true trigger linphone to initiate a registration process for all proxies.
+ * Calling this method disables the automatic network detection mode. It means you must call this method after each network state changes.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_network_reachable(LinphoneCore* lc,bool_t value);
+
+/**
+ * return network state either as positioned by the application or by linphone itself.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_is_network_reachable(LinphoneCore* lc);
+
+/**
+ * This method is called by the application to notify the linphone core library when the SIP network is reachable.
+ * This is for advanced usage, when SIP and RTP layers are required to use different interfaces.
+ * Most applications just need linphone_core_set_network_reachable().
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_sip_network_reachable(LinphoneCore* lc,bool_t value);
+
+/**
+ * This method is called by the application to notify the linphone core library when the media (RTP) network is reachable.
+ * This is for advanced usage, when SIP and RTP layers are required to use different interfaces.
+ * Most applications just need linphone_core_set_network_reachable().
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_media_network_reachable(LinphoneCore* lc,bool_t value);
+
+/**
+ * Enables signaling keep alive, small udp packet sent periodically to keep udp NAT association.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] enable A boolean value telling whether signaling keep alive is to be enabled
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_enable_keep_alive(LinphoneCore* lc, bool_t enable);
+
+/**
+ * Is signaling keep alive enabled.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether signaling keep alive is enabled
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_keep_alive_enabled(LinphoneCore* lc);
+
+/**
+ * Retrieves the user pointer that was given to linphone_core_new()
+ * @param[in] lc #LinphoneCore object
+ * @return The user data associated with the #LinphoneCore object
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC void *linphone_core_get_user_data(const LinphoneCore *lc);
+
+/**
+ * Associate a user pointer to the linphone core.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] userdata The user data to associate with the #LinphoneCore object
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC void linphone_core_set_user_data(LinphoneCore *lc, void *userdata);
+
+/**
+ * This method is called by the application to notify the linphone core library when it enters background mode.
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC void linphone_core_enter_background(LinphoneCore *lc);
+
+/**
+ * This method is called by the application to notify the linphone core library when it enters foreground mode.
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC void linphone_core_enter_foreground(LinphoneCore *lc);
+
+/**
+ * Returns the LpConfig object used to manage the storage (config) file.
+ * @param[in] lc #LinphoneCore object
+ * The application can use the LpConfig object to insert its own private
+ * sections and pairs of key=value in the configuration file.
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneConfig * linphone_core_get_config(const LinphoneCore *lc);
+
+/**
+ * Create a LpConfig object from a user config file.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] filename The filename of the config file to read to fill the instantiated LpConfig
+ * @ingroup misc
+ * @deprecated Use linphone_core_create_config() instead.
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneConfig * linphone_core_create_lp_config(LinphoneCore *lc, const char *filename);
+
+/**
+ * Create a #LinphoneConfig object from a user config file.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] filename The filename of the config file to read to fill the instantiated #LinphoneConfig
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC LinphoneConfig * linphone_core_create_config(LinphoneCore *lc, const char *filename);
+
+/**
+ * Set a callback for some blocking operations, it takes you informed of the progress of the operation
+ */
+LINPHONE_PUBLIC void linphone_core_set_waiting_callback(LinphoneCore *lc, LinphoneCoreWaitingCallback cb, void *user_context);
+
+/**
+ * Returns the list of registered SipSetup (linphonecore plugins)
+ */
+LINPHONE_PUBLIC const bctbx_list_t * linphone_core_get_sip_setups(LinphoneCore *lc);
+
+/**
+ * Destroys a #LinphoneCore
+ * @param[in] lc #LinphoneCore object
+ * @ingroup initializing
+ * @deprecated Use linphone_core_unref() instead.
+ * @donotwrap
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_core_destroy(LinphoneCore *lc);
+
+/*for advanced users:*/
+typedef RtpTransport * (*LinphoneCoreRtpTransportFactoryFunc)(void *data, int port);
+struct _LinphoneRtpTransportFactories{
+	LinphoneCoreRtpTransportFactoryFunc audio_rtp_func;
+	void *audio_rtp_func_data;
+	LinphoneCoreRtpTransportFactoryFunc audio_rtcp_func;
+	void *audio_rtcp_func_data;
+	LinphoneCoreRtpTransportFactoryFunc video_rtp_func;
+	void *video_rtp_func_data;
+	LinphoneCoreRtpTransportFactoryFunc video_rtcp_func;
+	void *video_rtcp_func_data;
+};
+typedef struct _LinphoneRtpTransportFactories LinphoneRtpTransportFactories;
+
+void linphone_core_set_rtp_transport_factories(LinphoneCore* lc, LinphoneRtpTransportFactories *factories);
+
+/**
+ * Retrieve RTP statistics regarding current call.
+ * @param[in] lc #LinphoneCore object
+ * @param[out] local RTP statistics computed locally.
+ * @param[out] remote RTP statistics computed by far end (obtained via RTCP feedback).
+ * @return 0 or -1 if no call is running.
+ * @note Remote RTP statistics is not implemented yet.
+**/
+int linphone_core_get_current_call_stats(LinphoneCore *lc, rtp_stats_t *local, rtp_stats_t *remote);
+
+/**
+ * Get the number of Call
+ * @param[in] lc #LinphoneCore object
+ * @return The current number of calls
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC int linphone_core_get_calls_nb(const LinphoneCore *lc);
+
+/**
+ * Gets the current list of calls.
+ * Note that this list is read-only and might be changed by the core after a function call to linphone_core_iterate().
+ * Similarly the #LinphoneCall objects inside it might be destroyed without prior notice.
+ * To hold references to #LinphoneCall object into your program, you must use linphone_call_ref().
+ * @param[in] lc The #LinphoneCore object
+ * @return \bctbx_list{LinphoneCall}
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC const bctbx_list_t *linphone_core_get_calls(LinphoneCore *lc);
+
+LINPHONE_PUBLIC LinphoneGlobalState linphone_core_get_global_state(const LinphoneCore *lc);
+
+/**
+ * force registration refresh to be initiated upon next iterate
+ * @ingroup proxies
+ */
+LINPHONE_PUBLIC void linphone_core_refresh_registers(LinphoneCore* lc);
+
+/**
+ * Set the path to the file storing the zrtp secrets cache.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] file The path to the file to use to store the zrtp secrets cache.
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC void linphone_core_set_zrtp_secrets_file(LinphoneCore *lc, const char* file);
+
+/**
+ * Get the path to the file storing the zrtp secrets cache.
+ * @param[in] lc #LinphoneCore object.
+ * @return The path to the file storing the zrtp secrets cache.
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_zrtp_secrets_file(LinphoneCore *lc);
+
+/**
+ * Get a pointer to the sqlite db holding zrtp/lime cache.
+ * @param[in] lc #LinphoneCore object.
+ * @return An sqlite3 pointer cast to a void one or NULL if cache is not available(not enabled at compile or access failed)
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void *linphone_core_get_zrtp_cache_db(LinphoneCore *lc);
+
+struct _zrtpCacheAccess{
+	void *db; /**< points to the zrtp cache sqlite database, is cast into a void * to support cacheless build */
+	bctbx_mutex_t *dbMutex; /**< the mutex used to prevent conflicting access to the database */
+};
+typedef struct _zrtpCacheAccess zrtpCacheAccess;
+
+/**
+ * Get a pointer to a structure holding pointers to access zrtp/lime cache.
+ * The structure will hold a sqlite db pointer and a bctoolbox mutex pointer
+ *
+ * @param[in] lc #LinphoneCore object.
+ * @return a structure holding db pointer(NULL is cache is not available by built or runtime error) and the mutex associated to it
+ */
+LINPHONE_PUBLIC  zrtpCacheAccess linphone_core_get_zrtp_cache_access(LinphoneCore *lc);
+
+/**
+ * Get the zrtp sas validation status for a peer uri.
+ * Once the SAS has been validated or rejected, the status will never return to Unknown (unless you delete your cache)
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] addr the peer uri
+ * @ingroup media_parameters
+ * @return  - LinphoneZrtpPeerStatusUnknown: this uri is not present in cache OR during calls with the active device, SAS never was validated or rejected
+ *  		- LinphoneZrtpPeerStatusValid: the active device status is set to valid
+ *  		- LinphoneZrtpPeerStatusInvalid: the active peer device status is set to invalid
+ */
+LINPHONE_PUBLIC LinphoneZrtpPeerStatus linphone_core_get_zrtp_status(LinphoneCore *lc, const char *addr);
+
+/**
+ * Set the path to the directory storing the user's x509 certificates (used by dtls)
+ * @param[in] lc #LinphoneCore object
+ * @param[in] path The path to the directory to use to store the user's certificates.
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC void linphone_core_set_user_certificates_path(LinphoneCore *lc, const char* path);
+
+/**
+ * Get the path to the directory storing the user's certificates.
+ * @param[in] lc #LinphoneCore object.
+ * @returns The path to the directory storing the user's certificates.
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_user_certificates_path(LinphoneCore *lc);
+
+/**
+ * Reload mediastreamer2 plugins from specified directory.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] path the path from where plugins are to be loaded, pass NULL to use default (compile-time determined) plugin directory.
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC void linphone_core_reload_ms_plugins(LinphoneCore *lc, const char *path);
+
+/**
+ * Search from the list of current calls if a remote address match uri
+ * @ingroup call_control
+ * @param lc
+ * @param uri which should match call remote uri
+ * @return #LinphoneCall or NULL is no match is found
+ */
+LINPHONE_PUBLIC LinphoneCall* linphone_core_find_call_from_uri(const LinphoneCore *lc, const char *uri);
+
+/**
+ * @addtogroup call_control
+ * @{
+ */
+
+/**
+ * Create some default conference parameters for instanciating a a conference with linphone_core_create_conference_with_params().
+ * @param lc the core
+ * @return conference parameters.
+**/
+LINPHONE_PUBLIC LinphoneConferenceParams * linphone_core_create_conference_params(LinphoneCore *lc);
+
+
+/**
+ * Create a conference
+ * @param lc The #LinphoneCore instance where the conference will be created inside.
+ * @param params Parameters of the conference. See #LinphoneConferenceParams.
+ * @return A pointer on the freshly created conference. That object will be automatically
+ * freed by the core after calling linphone_core_terminate_conference().
+ */
+LINPHONE_PUBLIC LinphoneConference *linphone_core_create_conference_with_params(LinphoneCore *lc, const LinphoneConferenceParams *params);
+
+
+/**
+ * Add a participant to the conference. If no conference is going on
+ * a new internal conference context is created and the participant is
+ * added to it.
+ * @param lc #LinphoneCore
+ * @param call The current call with the participant to add
+ * @return 0 if succeeded. Negative number if failed
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_add_to_conference(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * Add all current calls into the conference. If no conference is running
+ * a new internal conference context is created and all current calls
+ * are added to it.
+ * @param lc #LinphoneCore
+ * @return 0 if succeeded. Negative number if failed
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_add_all_to_conference(LinphoneCore *lc);
+
+/**
+ * Remove a call from the conference.
+ * @param lc the linphone core
+ * @param call a call that has been previously merged into the conference.
+ *
+ * After removing the remote participant belonging to the supplied call, the call becomes a normal call in paused state.
+ * If one single remote participant is left alone together with the local user in the conference after the removal, then the conference is
+ * automatically transformed into a simple call in StreamsRunning state.
+ * The conference's resources are then automatically destroyed.
+ *
+ * In other words, unless linphone_core_leave_conference() is explicitly called, the last remote participant of a conference is automatically
+ * put in a simple call in running state.
+ *
+ * @return 0 if successful, -1 otherwise.
+ **/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_remove_from_conference(LinphoneCore *lc, LinphoneCall *call);
+
+/**
+ * Indicates whether the local participant is part of a conference.
+ * @warning That function automatically fails in the case of conferences using a
+ * conferencet server (focus). If you use such a conference, you should use
+ * linphone_conference_remove_participant() instead.
+ * @param lc the linphone core
+ * @return TRUE if the local participant is in a conference, FALSE otherwise.
+*/
+LINPHONE_PUBLIC bool_t linphone_core_is_in_conference(const LinphoneCore *lc);
+
+/**
+ * Join the local participant to the running conference
+ * @param lc #LinphoneCore
+ * @return 0 if succeeded. Negative number if failed
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_enter_conference(LinphoneCore *lc);
+
+/**
+ * Make the local participant leave the running conference
+ * @param lc #LinphoneCore
+ * @return 0 if succeeded. Negative number if failed
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_leave_conference(LinphoneCore *lc);
+
+/**
+ * Get the set input volume of the local participant
+ * @param lc #LinphoneCore
+ * @return A value inside [0.0 ; 1.0]
+ */
+LINPHONE_PUBLIC float linphone_core_get_conference_local_input_volume(LinphoneCore *lc);
+
+/**
+ * Terminate the running conference. If it is a local conference, all calls
+ * inside it will become back separate calls and will be put in #LinphoneCallPaused state.
+ * If it is a conference involving a focus server, all calls inside the conference
+ * will be terminated.
+ * @param lc #LinphoneCore
+ * @return 0 if succeeded. Negative number if failed
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_terminate_conference(LinphoneCore *lc);
+
+/**
+ * Get the number of participant in the running conference. The local
+ * participant is included in the count only if it is in the conference.
+ * @param lc #LinphoneCore
+ * @return The number of participant
+ */
+LINPHONE_PUBLIC int linphone_core_get_conference_size(LinphoneCore *lc);
+
+/**
+ * Start recording the running conference
+ * @param lc #LinphoneCore
+ * @param path Path to the file where the recording will be written
+ * @return 0 if succeeded. Negative number if failed
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_start_conference_recording(LinphoneCore *lc, const char *path);
+
+/**
+ * Stop recording the running conference
+ * @param lc #LinphoneCore
+ * @return 0 if succeeded. Negative number if failed
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_stop_conference_recording(LinphoneCore *lc);
+
+/**
+ * Get a pointer on the internal conference object.
+ * @param lc #LinphoneCore
+ * @return A pointer on #LinphoneConference or NULL if no conference are going on
+ */
+LINPHONE_PUBLIC LinphoneConference *linphone_core_get_conference(LinphoneCore *lc);
+
+/**
+ * Enable the conference server feature. This has the effect to listen of the conference factory uri
+ * to create new conferences when receiving INVITE messages there.
+ * @param[in] lc A #LinphoneCore object
+ * @param[in] enable A boolean value telling whether to enable or disable the conference server feature
+ */
+LINPHONE_PUBLIC void linphone_core_enable_conference_server (LinphoneCore *lc, bool_t enable);
+
+/**
+ * Tells whether the conference server feature is enabled.
+ * @param[in] lc A #LinphoneCore object
+ * @return A boolean value telling whether the conference server feature is enabled or not
+ */
+LINPHONE_PUBLIC bool_t linphone_core_conference_server_enabled (const LinphoneCore *lc);
+
+/**
+ * @}
+ */
+
+/**
+ * Get the maximum number of simultaneous calls Linphone core can manage at a time. All new call above this limit are declined with a busy answer
+ * @param lc core
+ * @return max number of simultaneous calls
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC int linphone_core_get_max_calls(LinphoneCore *lc);
+
+/**
+ * Set the maximum number of simultaneous calls Linphone core can manage at a time. All new call above this limit are declined with a busy answer
+ * @param lc core
+ * @param max number of simultaneous calls
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC void linphone_core_set_max_calls(LinphoneCore *lc, int max);
+
+/**
+ * Check if a call will need the sound resources in near future (typically an outgoing call that is awaiting
+ * response).
+ * In liblinphone, it is not possible to have two independant calls using sound device or camera at the same time.
+ * In order to prevent this situation, an application can use linphone_core_sound_resources_locked() to know whether
+ * it is possible at a given time to start a new outgoing call.
+ * When the function returns TRUE, an application should not allow the user to start an outgoing call.
+ * @param[in] lc #LinphoneCore object
+ * @return A boolean value telling whether a call will need the sound resources in near future
+ * @ingroup call_control
+**/
+LINPHONE_PUBLIC bool_t linphone_core_sound_resources_locked(LinphoneCore *lc);
+
+/**
+ * Check if a media encryption type is supported
+ * @param lc core
+ * @param menc #LinphoneMediaEncryption
+ * @return whether a media encryption scheme is supported by the #LinphoneCore engine
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC bool_t linphone_core_media_encryption_supported(const LinphoneCore *lc, LinphoneMediaEncryption menc);
+
+/**
+ * Choose the media encryption policy to be used for RTP packets.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] menc The media encryption policy to be used.
+ * @return 0 if successful, any other value otherwise.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_media_encryption(LinphoneCore *lc, LinphoneMediaEncryption menc);
+
+/**
+ * Get the media encryption policy being used for RTP packets.
+ * @param[in] lc #LinphoneCore object.
+ * @return The media encryption policy being used.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC LinphoneMediaEncryption linphone_core_get_media_encryption(LinphoneCore *lc);
+
+/**
+ * Check if the configured media encryption is mandatory or not.
+ * @param[in] lc #LinphoneCore object.
+ * @return TRUE if media encryption is mandatory; FALSE otherwise.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_is_media_encryption_mandatory(LinphoneCore *lc);
+
+/**
+ * Define whether the configured media encryption is mandatory, if it is and the negotation cannot result 
+ * in the desired media encryption then the call will fail. If not an INVITE will be resent with encryption
+ * disabled.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] m TRUE to set it mandatory; FALSE otherwise.
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_media_encryption_mandatory(LinphoneCore *lc, bool_t m);
+
+/**
+ * Init call params using LinphoneCore's current configuration
+ */
+LINPHONE_PUBLIC void linphone_core_init_default_params(LinphoneCore*lc, LinphoneCallParams *params);
+
+/**
+ * True if tunnel support was compiled.
+ * @ingroup tunnel
+ */
+LINPHONE_PUBLIC bool_t linphone_core_tunnel_available(void);
+
+/**
+ * get tunnel instance if available
+ * @ingroup tunnel
+ * @param lc core object
+ * @returns #LinphoneTunnel or NULL if not available
+ */
+LINPHONE_PUBLIC LinphoneTunnel *linphone_core_get_tunnel(const LinphoneCore *lc);
+
+/**
+ * Set the DSCP field for SIP signaling channel.
+ * The DSCP defines the quality of service in IP packets.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] dscp The DSCP value to set
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_sip_dscp(LinphoneCore *lc, int dscp);
+
+/**
+ * Get the DSCP field for SIP signaling channel.
+ * The DSCP defines the quality of service in IP packets.
+ * @param[in] lc #LinphoneCore object
+ * @return The current DSCP value
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_sip_dscp(const LinphoneCore *lc);
+
+/**
+ * Set the DSCP field for outgoing audio streams.
+ * The DSCP defines the quality of service in IP packets.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] dscp The DSCP value to set
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_audio_dscp(LinphoneCore *lc, int dscp);
+
+/**
+ * Get the DSCP field for outgoing audio streams.
+ * The DSCP defines the quality of service in IP packets.
+ * @param[in] lc #LinphoneCore object
+ * @return The current DSCP value
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_audio_dscp(const LinphoneCore *lc);
+
+/**
+ * Set the DSCP field for outgoing video streams.
+ * The DSCP defines the quality of service in IP packets.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] dscp The DSCP value to set
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_video_dscp(LinphoneCore *lc, int dscp);
+
+/**
+ * Get the DSCP field for outgoing video streams.
+ * The DSCP defines the quality of service in IP packets.
+ * @param[in] lc #LinphoneCore object
+ * @return The current DSCP value
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_video_dscp(const LinphoneCore *lc);
+
+/**
+ * Get the name of the mediastreamer2 filter used for rendering video.
+ * @param[in] lc #LinphoneCore object
+ * @return The currently selected video display filter
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char *linphone_core_get_video_display_filter(LinphoneCore *lc);
+
+/**
+ * Set the name of the mediastreamer2 filter to be used for rendering video.
+ * This is for advanced users of the library, mainly to workaround hardware/driver bugs.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_video_display_filter(LinphoneCore *lc, const char *filtername);
+
+/**
+ * Get the name of the default mediastreamer2 filter used for rendering video on the current platform.
+ * This is for advanced users of the library, mainly to expose mediastreamer video filter name and status.
+ * @param[in] lc #LinphoneCore object
+ * @return The default video display filter
+ * @ingroup media_parameters
+ **/
+LINPHONE_PUBLIC const char *linphone_core_get_default_video_display_filter(LinphoneCore *lc);
+
+/**
+ * Checks if the given media filter is loaded and usable.
+ * This is for advanced users of the library, mainly to expose mediastreamer video filter status.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] filtername the filter name
+ * @return true	if the filter is loaded and usable, false otherwise
+ * @ingroup media_parameters
+ **/
+LINPHONE_PUBLIC bool_t linphone_core_is_media_filter_supported(LinphoneCore *lc, const char *filtername);
+
+/**
+ * Get the name of the mediastreamer2 filter used for echo cancelling.
+ * @param[in] lc #LinphoneCore object
+ * @return The name of the mediastreamer2 filter used for echo cancelling
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC const char * linphone_core_get_echo_canceller_filter_name(const LinphoneCore *lc);
+
+/**
+ * Set the name of the mediastreamer2 filter to be used for echo cancelling.
+ * This is for advanced users of the library.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] filtername The name of the mediastreamer2 filter to be used for echo cancelling
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_echo_canceller_filter_name(LinphoneCore *lc, const char *filtername);
+
+/** Contact Providers
+  */
+
+typedef void (*ContactSearchCallback)( LinphoneContactSearch* id, bctbx_list_t* friends, void* data );
+
+/**
+ * Set URI where to download xml configuration file at startup.
+ * This can also be set from configuration file or factory config file, from [misc] section, item "config-uri".
+ * Calling this function does not load the configuration. It will write the value into configuration so that configuration
+ * from remote URI will take place at next #LinphoneCore start.
+ * @param lc the linphone core
+ * @param uri the http or https uri to use in order to download the configuration. Passing NULL will disable remote provisioning.
+ * @return -1 if uri could not be parsed, 0 otherwise. Note that this does not check validity of URI endpoint nor scheme and download may still fail.
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_provisioning_uri(LinphoneCore *lc, const char*uri);
+
+/**
+ * Get provisioning URI.
+ * @param lc the linphone core
+ * @return the provisioning URI.
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC const char* linphone_core_get_provisioning_uri(const LinphoneCore *lc);
+
+/**
+ * Gets if the provisioning URI should be removed after it's been applied successfully
+ * @param lc the linphone core
+ * @return TRUE if the provisioning URI should be removed, FALSE otherwise
+ */
+LINPHONE_PUBLIC bool_t linphone_core_is_provisioning_transient(LinphoneCore *lc);
+
+/**
+ * Migrate configuration so that all SIP transports are enabled.
+ * Versions of linphone < 3.7 did not support using multiple SIP transport simultaneously.
+ * This function helps application to migrate the configuration so that all transports are enabled.
+ * Existing proxy configuration are added a transport parameter so that they continue using the unique transport that was set previously.
+ * This function must be used just after creating the core, before any call to linphone_core_iterate()
+ * @param lc the linphone core
+ * @return 1 if migration was done, 0 if not done because unnecessary or already done, -1 in case of error.
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_migrate_to_multi_transport(LinphoneCore *lc);
+
+
+/**
+ * Control when media offer is sent in SIP INVITE.
+ * @param lc the linphone core
+ * @param enable true if INVITE has to be sent whitout SDP.
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_sdp_200_ack(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Media offer control param for SIP INVITE.
+ * @return true if INVITE has to be sent whitout SDP.
+ * @ingroup network_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_sdp_200_ack_enabled(const LinphoneCore *lc);
+
+/**
+ * Assign an audio file to be played locally upon call failure, for a given reason.
+ * @param lc the core
+ * @param reason the #LinphoneReason representing the failure error code.
+ * @param audiofile a wav file to be played when such call failure happens.
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC void linphone_core_set_call_error_tone(LinphoneCore *lc, LinphoneReason reason, const char *audiofile);
+
+/**
+ * Assign an audio file to be played as a specific tone id.
+ * This function typically allows to customize telephony tones per country.
+ * @param lc the core
+ * @param id the tone id
+ * @param audiofile a wav file to be played.
+**/
+LINPHONE_PUBLIC void linphone_core_set_tone(LinphoneCore *lc, LinphoneToneID id, const char *audiofile);
+
+/**
+ * Globaly set an http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml. This value can also be set for a dedicated account using #linphone_proxy_config_set_file_transfer_server
+ * @param[in] core #LinphoneCore to be modified
+ * @param[in] server_url URL of the file server like https://file.linphone.org/upload.php
+ * @ingroup misc
+ * */
+LINPHONE_PUBLIC void linphone_core_set_file_transfer_server(LinphoneCore *core, const char * server_url);
+
+/**
+ * Get the globaly set http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml.
+ * @param[in] core #LinphoneCore from which to get the server_url
+ * @return URL of the file server like https://file.linphone.org/upload.php
+ * @ingroup misc
+ * */
+LINPHONE_PUBLIC const char * linphone_core_get_file_transfer_server(LinphoneCore *core);
+
+/**
+ * Returns a null terminated table of strings containing the file format extension supported for call recording.
+ * @param core the core
+ * @return the supported formats, typically 'wav' and 'mkv'
+ * @ingroup media_parameters
+ * @deprecated use linphone_core_get_supported_file_formats_list instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC const char ** linphone_core_get_supported_file_formats(LinphoneCore *core);
+
+/**
+ * Returns a null terminated table of strings containing the file format extension supported for call recording.
+ * @param core the core
+ * @return \bctbx_list{char *} the supported formats, typically 'wav' and 'mkv'
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bctbx_list_t * linphone_core_get_supported_file_formats_list(LinphoneCore *core);
+
+/**
+ * Returns whether a specific file format is supported.
+ * @see linphone_core_get_supported_file_formats
+ * @param lc A #LinphoneCore object
+ * @param fmt The format extension (wav, mkv).
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_file_format_supported(LinphoneCore *lc, const char *fmt);
+
+/**
+ * This function controls signaling features supported by the core.
+ * They are typically included in a SIP Supported header.
+ * @param[in] core #LinphoneCore object
+ * @param[in] tag The feature tag name
+ * @ingroup initializing
+**/
+LINPHONE_PUBLIC void linphone_core_add_supported_tag(LinphoneCore *core, const char *tag);
+
+/**
+ * Remove a supported tag.
+ * @param[in] core #LinphoneCore object
+ * @param[in] tag The tag to remove
+ * @ingroup initializing
+ * @see linphone_core_add_supported_tag()
+**/
+LINPHONE_PUBLIC void linphone_core_remove_supported_tag(LinphoneCore *core, const char *tag);
+
+/**
+ * Enable RTCP feedback (also known as RTP/AVPF profile).
+ * Setting #LinphoneAVPFDefault is equivalent to LinphoneAVPFDisabled.
+ * This setting can be overriden per #LinphoneProxyConfig with linphone_proxy_config_set_avpf_mode().
+ * The value set here is used for calls placed or received out of any proxy configured, or if the proxy config is configured with LinphoneAVPFDefault.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] mode The AVPF mode to use.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_avpf_mode(LinphoneCore *lc, LinphoneAVPFMode mode);
+
+/**
+ * Return AVPF enablement. See linphone_core_set_avpf_mode() .
+ * @param[in] lc #LinphoneCore object
+ * @return The current AVPF mode
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneAVPFMode linphone_core_get_avpf_mode(const LinphoneCore *lc);
+
+/**
+ * Set the avpf report interval in seconds.
+ * This value can be overriden by the proxy config using linphone_proxy_config_set_avpf_rr_interval().
+ * @param[in] lc #LinphoneCore object
+ * @param[in] interval The report interval in seconds
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_set_avpf_rr_interval(LinphoneCore *lc, int interval);
+
+/**
+ * Return the avpf report interval in seconds.
+ * @param[in] lc #LinphoneCore object
+ * @return The current AVPF report interval in seconds
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_avpf_rr_interval(const LinphoneCore *lc);
+
+/**
+ * Use to set multicast address to be used for audio stream.
+ * @param core #LinphoneCore
+ * @param ip an ipv4/6 multicast address
+ * @return 0 in case of success
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_audio_multicast_addr(LinphoneCore *lc, const char *ip);
+
+/**
+ * Use to set multicast address to be used for video stream.
+ * @param lc #LinphoneCore
+ * @param ip an ipv4/6 multicast address
+ * @return 0 in case of success
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_video_multicast_addr(LinphoneCore *lc, const char *ip);
+
+/**
+ * Use to get multicast address to be used for audio stream.
+ * @param core #LinphoneCore
+ * @return an ipv4/6 multicast address or default value
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char* linphone_core_get_audio_multicast_addr(const LinphoneCore *core);
+
+/**
+ * Use to get multicast address to be used for video stream.
+ * @param core #LinphoneCore
+ * @return an ipv4/6 multicast address, or default value
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char* linphone_core_get_video_multicast_addr(const LinphoneCore *core);
+
+/**
+ * Use to set multicast ttl to be used for audio stream.
+ * @param core #LinphoneCore
+ * @param ttl value or -1 if not used. [0..255] default value is 1
+ * @return 0 in case of success
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_audio_multicast_ttl(LinphoneCore *core, int ttl);
+
+/**
+ * Use to set multicast ttl to be used for video stream.
+ * @param lc #LinphoneCore
+ * @param  ttl value or -1 if not used. [0..255] default value is 1
+ * @return 0 in case of success
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_video_multicast_ttl(LinphoneCore *lc, int ttl);
+
+/**
+ * Use to get multicast ttl to be used for audio stream.
+ * @param core #LinphoneCore
+ * @return a time to leave value
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_audio_multicast_ttl(const LinphoneCore *core);
+
+/**
+ * Use to get multicast ttl to be used for video stream.
+ * @param core #LinphoneCore
+ * @return a time to leave value
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC int linphone_core_get_video_multicast_ttl(const LinphoneCore *core);
+
+/**
+ * Use to enable multicast rtp for audio stream.
+ * If enabled, outgoing calls put a multicast address from #linphone_core_get_video_multicast_addr into audio cline. In case of outgoing call audio stream is sent to this multicast address.
+ * For incoming calls behavior is unchanged.
+ * @param core #LinphoneCore
+ * @param yesno if yes, subsequent calls will propose multicast ip set by #linphone_core_set_audio_multicast_addr
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_audio_multicast(LinphoneCore *core, bool_t yesno);
+
+/**
+ * Use to get multicast state of audio stream.
+ * @param core #LinphoneCore
+ * @return true if  subsequent calls will propose multicast ip set by #linphone_core_set_audio_multicast_addr
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_audio_multicast_enabled(const LinphoneCore *core);
+
+/**
+ * Use to enable multicast rtp for video stream.
+ * If enabled, outgoing calls put a multicast address from #linphone_core_get_video_multicast_addr into video cline. In case of outgoing call video stream is sent to this  multicast address.
+ * For incoming calls behavior is unchanged.
+ * @param core #LinphoneCore
+ * @param yesno if yes, subsequent outgoing calls will propose multicast ip set by #linphone_core_set_video_multicast_addr
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC void linphone_core_enable_video_multicast(LinphoneCore *core, bool_t yesno);
+
+/**
+ * Use to get multicast state of video stream.
+ * @param core #LinphoneCore
+ * @return true if  subsequent calls will propose multicast ip set by #linphone_core_set_video_multicast_addr
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC bool_t linphone_core_video_multicast_enabled(const LinphoneCore *core);
+
+/**
+ * @brief Set the network simulator parameters.
+ *
+ * Liblinphone has the capabability of simulating the effects of a network (latency, lost packets, jitter, max bandwidth).
+ * Please refer to the oRTP documentation for the meaning of the parameters of the OrtpNetworkSimulatorParams structure.
+ * This function has effect for future calls, but not for currently running calls, though this behavior may be changed in future versions.
+ * @warning Due to design of network simulation in oRTP, simulation is applied independently for audio and video stream. This means for example that a bandwidth
+ * limit of 250kbit/s will have no effect on an audio stream running at 40kbit/s while a videostream targetting 400kbit/s will be highly affected.
+ * @param lc the #LinphoneCore
+ * @param params the parameters used for the network simulation.
+ * @return 0 if successful, -1 otherwise.
+ * @ingroup media_parameters
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_set_network_simulator_params(LinphoneCore *lc, const OrtpNetworkSimulatorParams *params);
+
+/**
+ * @brief Get the previously set network simulation parameters.
+ * @see linphone_core_set_network_simulator_params
+ * @return a #OrtpNetworkSimulatorParams structure.
+ * @ingroup media_parameters
+ * @donotwrap
+**/
+LINPHONE_PUBLIC const OrtpNetworkSimulatorParams *linphone_core_get_network_simulator_params(const LinphoneCore *lc);
+
+/**
+ * Set the video preset to be used for video calls.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] preset The name of the video preset to be used (can be NULL to use the default video preset).
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_video_preset(LinphoneCore *lc, const char *preset);
+
+/**
+ * Get the video preset used for video calls.
+ * @param[in] lc #LinphoneCore object
+ * @return The name of the video preset used for video calls (can be NULL if the default video preset is used).
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC const char * linphone_core_get_video_preset(const LinphoneCore *lc);
+
+/**
+ * Gets if realtime text is enabled or not
+ * @param[in] lc #LinphoneCore object
+ * @return true if realtime text is enabled, false otherwise
+ * @ingroup media_parameters
+ */
+LINPHONE_PUBLIC bool_t linphone_core_realtime_text_enabled(LinphoneCore *lc);
+
+LINPHONE_PUBLIC void linphone_core_enable_realtime_text(LinphoneCore *lc, bool_t value);
+
+/**
+ * Set http proxy address to be used for signaling during next channel connection. Use #linphone_core_set_network_reachable FASLE/TRUE to force channel restart.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] host Hostname of IP adress of the http proxy (can be NULL to disable).
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_http_proxy_host(LinphoneCore *lc, const char *host) ;
+
+/**
+ * Set http proxy port to be used for signaling.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] port of the http proxy.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_http_proxy_port(LinphoneCore *lc, int port) ;
+
+/**
+ * Get http proxy address to be used for signaling.
+ * @param[in] lc #LinphoneCore object
+ * @return hostname of IP adress of the http proxy (can be NULL to disable).
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_http_proxy_host(const LinphoneCore *lc);
+
+/**
+ * Get http proxy port to be used for signaling.
+ * @param[in] lc #LinphoneCore object
+ * @return port of the http proxy.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC int linphone_core_get_http_proxy_port(const LinphoneCore *lc);
+
+LINPHONE_PUBLIC LinphoneRingtonePlayer *linphone_core_get_ringtoneplayer(LinphoneCore *lc);
+
+/**
+ * Sets a TLS certificate used for TLS authentication
+ * The certificate won't be stored, you have to set it after each #LinphoneCore startup
+ * @param lc #LinphoneCore object
+ * @param tls_cert the TLS certificate
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_tls_cert(LinphoneCore *lc, const char *tls_cert);
+
+/**
+ * Sets a TLS key used for TLS authentication
+ * The key won't be stored, you have to set it after each #LinphoneCore startup
+ * @param lc #LinphoneCore object
+ * @param tls_key the TLS key
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_tls_key(LinphoneCore *lc, const char *tls_key);
+
+/**
+ * Sets a TLS certificate path used for TLS authentication
+ * The path will be stored in the rc file and automatically restored on startup
+ * @param lc #LinphoneCore object
+ * @param tls_cert_path path to the TLS certificate
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_tls_cert_path(LinphoneCore *lc, const char *tls_cert_path);
+
+/**
+ * Sets a TLS key path used for TLS authentication
+ * The path will be stored in the rc file and automatically restored on startup
+ * @param lc #LinphoneCore object
+ * @param tls_key_path path to the TLS key
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC void linphone_core_set_tls_key_path(LinphoneCore *lc, const char *tls_key_path);
+
+/**
+ * Gets the TLS certificate
+ * @param lc #LinphoneCore object
+ * @return the TLS certificate or NULL if not set yet
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_tls_cert(const LinphoneCore *lc);
+
+/**
+ * Gets the TLS key
+ * @param lc #LinphoneCore object
+ * @return the TLS key or NULL if not set yet
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_tls_key(const LinphoneCore *lc);
+
+/**
+ * Gets the path to the TLS certificate file
+ * @param lc #LinphoneCore object
+ * @return the TLS certificate path or NULL if not set yet
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_tls_cert_path(const LinphoneCore *lc);
+
+/**
+ * Gets the path to the TLS key file
+ * @param lc #LinphoneCore object
+ * @return the TLS key path or NULL if not set yet
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC const char *linphone_core_get_tls_key_path(const LinphoneCore *lc);
+
+/**
+ * Sets an IM Encryption Engine in the core
+ * @param lc #LinphoneCore object
+ * @param imee #LinphoneImEncryptionEngine object
+ * @ingroup chatroom
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void linphone_core_set_im_encryption_engine(LinphoneCore *lc, LinphoneImEncryptionEngine *imee);
+
+/**
+ * Gets the IM Encryption Engine in the core if possible
+ * @param lc #LinphoneCore object
+ * @return the IM Encryption Engine in the core or NULL
+ * @ingroup chatroom
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LinphoneImEncryptionEngine * linphone_core_get_im_encryption_engine(const LinphoneCore *lc);
+
+/**
+ * Tells whether a content type is supported.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] content_type The content type to check
+ * @return A boolean value telling whether the specified content type is supported or not.
+ */
+LINPHONE_PUBLIC bool_t linphone_core_is_content_type_supported(const LinphoneCore *lc, const char *content_type);
+
+/**
+ * Add support for the specified content type.
+ * It is the application responsibility to handle it correctly afterwards.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] content_type The content type to add support for
+ */
+LINPHONE_PUBLIC void linphone_core_add_content_type_support(LinphoneCore *lc, const char *content_type);
+
+/**
+ * Remove support for the specified content type.
+ * It is the application responsibility to handle it correctly afterwards.
+ * @param[in] lc LinphoneCore object
+ * @param[in] content_type The content type to remove support for
+ */
+LINPHONE_PUBLIC void linphone_core_remove_content_type_support(LinphoneCore *lc, const char *content_type);
+
+/**
+ * Get the linphone specs value telling what functionalities the linphone client supports.
+ * @param[in] core #LinphoneCore object
+ * @return The linphone specs telling what functionalities the linphone client supports
+ * @ingroup initializing
+ * @deprecated Use linphone_core_get_linphone_specs_list instead. Deprecated since 2019-02-07
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const char *linphone_core_get_linphone_specs (const LinphoneCore *core);
+
+/**
+ * Set the linphone specs value telling what functionalities the linphone client supports.
+ * @param[in] core #LinphoneCore object
+ * @param[in] specs The linphone specs to set
+ * @ingroup initializing
+ * @deprecated Use linphone_core_set_linphone_specs_list or linphone_core_add_linphone_spec instead. Deprecated since 2019-02-07
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_linphone_specs (LinphoneCore *core, const char *specs);
+
+/**
+ * Set the linphone specs list value telling what functionalities the linphone client supports.
+ * @param[in] core #LinphoneCore object
+ * @param[in] specs \bctbx_list{char *} The list of string specs to set
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC void linphone_core_set_linphone_specs_list (LinphoneCore *core, const bctbx_list_t *specs);
+
+/**
+ * Add the given linphone specs to the list of functionalities the linphone client supports.
+ * @param[in] core #LinphoneCore object
+ * @param[in] spec The spec to add
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC void linphone_core_add_linphone_spec (LinphoneCore *core, const char *spec);
+
+/**
+ * Remove the given linphone specs from the list of functionalities the linphone client supports.
+ * @param[in] core #LinphoneCore object
+ * @param[in] spec The spec to remove
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC void linphone_core_remove_linphone_spec (LinphoneCore *core, const char *spec);
+
+/**
+ * Get the list of linphone specs string values representing what functionalities the linphone client supports
+ * @param[in] core #LinphoneCore object
+ * @return \bctbx_list{char *} a list of supported specs. The list must be freed with bctbx_list_free() after usage
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC const bctbx_list_t *linphone_core_get_linphone_specs_list (LinphoneCore *core);
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+/**
+ * Set the chat database path.
+ * @param lc the linphone core
+ * @param path the database path
+ * @deprecated 2018-01-10: Use only for migration purposes
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_core_set_chat_database_path(LinphoneCore *lc, const char *path);
+
+/**
+ * Get path to the database file used for storing chat messages.
+ * @param lc the linphone core
+ * @return file path or NULL if not exist
+ * @deprecated 2018-01-10
+ **/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC const char *linphone_core_get_chat_database_path(const LinphoneCore *lc);
+
+/**
+ * Create a client-side group chat room. When calling this function the chat room is only created
+ * at the client-side and is empty. You need to call linphone_chat_room_add_participants() to
+ * create at the server side and add participants to it.
+ * Also, the created chat room will not be a one-to-one chat room even if linphone_chat_room_add_participants() is called with only one participant.
+ *
+ * @param[in] lc A #LinphoneCore object
+ * @param[in] subject The subject of the group chat room
+ * @param[in] fallback Boolean value telling whether we should plan on being able to fallback to a basic chat room if the client-side group chat room creation fails
+ * @return The newly created client-side group chat room.
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneChatRoom * linphone_core_create_client_group_chat_room(LinphoneCore *lc, const char *subject, bool_t fallback);
+
+/**
+ * Create a client-side group chat room. When calling this function the chat room is only created
+ * at the client-side and is empty. You need to call linphone_chat_room_add_participants() to
+ * create at the server side and add participants to it.
+ * Also, the created chat room will not be a one-to-one chat room even if linphone_chat_room_add_participants() is called with only one participant.
+ *
+ * @param[in] lc A #LinphoneCore object
+ * @param[in] subject The subject of the group chat room
+ * @param[in] fallback Boolean value telling whether we should plan on being able to fallback to a basic chat room if the client-side group chat room creation fails
+ * @param[in] encrypted Boolean value telling whether we should apply encryption or not on chat messages sent and received on this room.
+ * @return The newly created client-side group chat room.
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneChatRoom *linphone_core_create_client_group_chat_room_2(LinphoneCore *lc, const char *subject, bool_t fallback, bool_t encrypted);
+
+/**
+ * Create a chat room.
+ *
+ * @param[in] lc A #LinphoneCore object
+ * @param[in] params The chat room creation parameters #LinphoneChatRoomParams
+ * @param[in] localAddr #LinphoneAddress representing the local proxy configuration to use for the chat room creation
+ * @param[in] subject The subject of the group chat room
+ * @param[in] participants \bctbx_list{LinphoneAddress} The initial list of participants of the chat room
+ * @return The newly created chat room.
+ */
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_create_chat_room(LinphoneCore *lc, const LinphoneChatRoomParams *params, const LinphoneAddress *localAddr, const char *subject, const bctbx_list_t *participants);
+
+/**
+ * Create a chat room.
+ *
+ * @param[in] lc A #LinphoneCore object
+ * @param[in] params The chat room creation parameters #LinphoneChatRoomParams
+ * @param[in] participants \bctbx_list{LinphoneAddress} The initial list of participants of the chat room
+ * @return The newly created chat room.
+ */
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_create_chat_room_2(LinphoneCore *lc, const LinphoneChatRoomParams *params, const char *subject, const bctbx_list_t *participants);
+
+/**
+ *
+ * @param[in] lc A #LinphoneCore object
+ * @param[in] subject The subject of the group chat room
+ * @param[in] participants \bctbx_list{LinphoneAddress} The initial list of participants of the chat room
+ * @return The newly created chat room.
+ */
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_create_chat_room_3(LinphoneCore *lc, const char *subject, const bctbx_list_t *participants);
+
+/**
+ *
+ * @param[in] lc A #LinphoneCore object
+ * @param[in] params The chat room creation parameters #LinphoneChatRoomParams
+ * @param[in] localAddr #LinphoneAddress representing the local proxy configuration to use for the chat room creation
+ * @param[in] participant #LinphoneAddress representing the initial participant to add to the chat room
+ * @return The newly created chat room.
+ */
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_create_chat_room_4(LinphoneCore *lc, const LinphoneChatRoomParams *params, const LinphoneAddress *localAddr, const LinphoneAddress *participant);
+
+/**
+ *
+ * @param[in] lc A #LinphoneCore object
+ * @param[in] participant #LinphoneAddress representing the initial participant to add to the chat room
+ * @return The newly created chat room.
+ */
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_create_chat_room_5(LinphoneCore *lc, const LinphoneAddress *participant);
+
+/**
+ * Get a basic chat room whose peer is the supplied address. If it does not exist yet, it will be created.
+ * No reference is transfered to the application. The #LinphoneCore keeps a reference on the chat room.
+ * @param lc the linphone core
+ * @param addr a linphone address.
+ * @return #LinphoneChatRoom where messaging can take place.
+**/
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_get_chat_room(LinphoneCore *lc, const LinphoneAddress *addr);
+
+/**
+ * Get a basic chat room. If it does not exist yet, it will be created.
+ * No reference is transfered to the application. The #LinphoneCore keeps a reference on the chat room.
+ * @param lc the linphone core
+ * @param peer_addr a linphone address.
+ * @param local_addr a linphone address.
+ * @return #LinphoneChatRoom where messaging can take place.
+**/
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_get_chat_room_2(
+	LinphoneCore *lc,
+	const LinphoneAddress *peer_addr,
+	const LinphoneAddress *local_addr
+);
+
+/**
+ * Get a basic chat room for messaging from a sip uri like sip:joe@sip.linphone.org. If it does not exist yet, it will be created.
+ * No reference is transfered to the application. The #LinphoneCore keeps a reference on the chat room.
+ * @param lc A #LinphoneCore object
+ * @param to The destination address for messages.
+ * @return #LinphoneChatRoom where messaging can take place.
+**/
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_get_chat_room_from_uri(LinphoneCore *lc, const char *to);
+
+/**
+ * Find a chat room.
+ * No reference is transfered to the application. The #LinphoneCore keeps a reference on the chat room.
+ * @param lc the linphone core
+ * @param peer_addr a linphone address.
+ * @param local_addr a linphone address.
+ * @return #LinphoneChatRoom where messaging can take place.
+**/
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_find_chat_room (
+	const LinphoneCore *lc,
+	const LinphoneAddress *peer_addr,
+	const LinphoneAddress *local_addr
+);
+
+/**
+ * Find a one to one chat room.
+ * No reference is transfered to the application. The #LinphoneCore keeps a reference on the chat room.
+ * @param lc the linphone core
+ * @param local_addr a linphone address.
+ * @param participant_addr a linphone address.
+ * @return #LinphoneChatRoom where messaging can take place.
+ * @deprecated Use linphone_core_find_one_to_one_chat_room_2 instead
+**/
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_find_one_to_one_chat_room (
+	const LinphoneCore *lc,
+	const LinphoneAddress *local_addr,
+	const LinphoneAddress *participant_addr
+);
+
+/**
+ * Find a one to one chat room.
+ * No reference is transfered to the application. The #LinphoneCore keeps a reference on the chat room.
+ * @param lc the linphone core
+ * @param local_addr a linphone address.
+ * @param participant_addr a linphone address.
+ * @param encrypted whether to look for an encrypted chat room or not
+ * @return #LinphoneChatRoom where messaging can take place.
+**/
+LINPHONE_PUBLIC LinphoneChatRoom *linphone_core_find_one_to_one_chat_room_2 (
+	const LinphoneCore *lc,
+	const LinphoneAddress *local_addr,
+	const LinphoneAddress *participant_addr,
+	bool_t encrypted
+);
+
+/**
+ * Removes a chatroom including all message history from the LinphoneCore.
+ * @param lc A #LinphoneCore object
+ * @param cr A #LinphoneChatRoom object
+**/
+LINPHONE_PUBLIC void linphone_core_delete_chat_room(LinphoneCore *lc, LinphoneChatRoom *cr);
+
+/**
+ * Inconditionnaly disable incoming chat messages.
+ * @param lc A #LinphoneCore object
+ * @param deny_reason the deny reason (#LinphoneReasonNone has no effect).
+**/
+LINPHONE_PUBLIC void linphone_core_disable_chat(LinphoneCore *lc, LinphoneReason deny_reason);
+
+/**
+ * Enable reception of incoming chat messages.
+ * By default it is enabled but it can be disabled with linphone_core_disable_chat().
+ * @param lc A #LinphoneCore object
+**/
+LINPHONE_PUBLIC void linphone_core_enable_chat(LinphoneCore *lc);
+
+/**
+ * Returns whether chat is enabled.
+ * @param lc A #LinphoneCore object
+**/
+LINPHONE_PUBLIC bool_t linphone_core_chat_enabled(const LinphoneCore *lc);
+
+/**
+ * Get the #LinphoneImNotifPolicy object controlling the instant messaging notifications.
+ * @param[in] lc #LinphoneCore object
+ * @return A #LinphoneImNotifPolicy object.
+ */
+LINPHONE_PUBLIC LinphoneImNotifPolicy * linphone_core_get_im_notif_policy(const LinphoneCore *lc);
+
+/**
+ * @}
+ */
+
+/**
+ * Create a content with default values from Linphone core.
+ * @param[in] lc #LinphoneCore object
+ * @return #LinphoneContent object with default values set
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC LinphoneContent * linphone_core_create_content(LinphoneCore *lc);
+
+
+/**
+ * @addtogroup event_api
+ * @{
+**/
+
+/**
+ * Create an outgoing subscription, specifying the destination resource, the event name, and an optional content body.
+ * If accepted, the subscription runs for a finite period, but is automatically renewed if not terminated before.
+ * @param lc the #LinphoneCore
+ * @param resource the destination resource
+ * @param event the event name
+ * @param expires the whished duration of the subscription
+ * @param body an optional body, may be NULL.
+ * @return a #LinphoneEvent holding the context of the created subcription.
+**/
+LINPHONE_PUBLIC LinphoneEvent *linphone_core_subscribe(LinphoneCore *lc, const LinphoneAddress *resource, const char *event, int expires, const LinphoneContent *body);
+
+/**
+ * Create an outgoing subscription, specifying the destination resource, the event name, and an optional content body.
+ * If accepted, the subscription runs for a finite period, but is automatically renewed if not terminated before.
+ * Unlike linphone_core_subscribe() the subscription isn't sent immediately. It will be send when calling linphone_event_send_subscribe().
+ * @param lc the #LinphoneCore
+ * @param resource the destination resource
+ * @param event the event name
+ * @param expires the whished duration of the subscription
+ * @return a #LinphoneEvent holding the context of the created subcription.
+**/
+LINPHONE_PUBLIC LinphoneEvent *linphone_core_create_subscribe(LinphoneCore *lc, const LinphoneAddress *resource, const char *event, int expires);
+
+/**
+ * Create an outgoing subscription, specifying the destination resource, the event name, and an optional content body.
+ * If accepted, the subscription runs for a finite period, but is automatically renewed if not terminated before.
+ * Unlike linphone_core_subscribe() the subscription isn't sent immediately. It will be send when calling linphone_event_send_subscribe().
+ * @param lc the #LinphoneCore
+ * @param resource the destination resource
+ * @param proxy the proxy configuration to use
+ * @param event the event name
+ * @param expires the whished duration of the subscription
+ * @return a #LinphoneEvent holding the context of the created subcription.
+ **/
+LINPHONE_PUBLIC LinphoneEvent *linphone_core_create_subscribe_2(LinphoneCore *lc, const LinphoneAddress *resource, LinphoneProxyConfig *proxy, const char *event, int expires);
+
+/**
+ * Create an out-of-dialog notification, specifying the destination resource, the event name.
+ * The notification can be send with linphone_event_notify().
+ * @param lc the #LinphoneCore
+ * @param resource the destination resource
+ * @param event the event name
+ * @return a #LinphoneEvent holding the context of the notification.
+**/
+LINPHONE_PUBLIC LinphoneEvent *linphone_core_create_notify(LinphoneCore *lc, const LinphoneAddress *resource, const char *event);
+
+/**
+ * Publish an event state.
+ * This first create a #LinphoneEvent with linphone_core_create_publish() and calls linphone_event_send_publish() to actually send it.
+ * After expiry, the publication is refreshed unless it is terminated before.
+ * @param lc the #LinphoneCore
+ * @param resource the resource uri for the event
+ * @param event the event name
+ * @param expires the lifetime of event being published, -1 if no associated duration, in which case it will not be refreshed.
+ * @param body the actual published data
+ * @return the #LinphoneEvent holding the context of the publish.
+**/
+LINPHONE_PUBLIC LinphoneEvent *linphone_core_publish(LinphoneCore *lc, const LinphoneAddress *resource, const char *event, int expires, const LinphoneContent *body);
+
+/**
+ * Create a publish context for an event state.
+ * After being created, the publish must be sent using linphone_event_send_publish().
+ * After expiry, the publication is refreshed unless it is terminated before.
+ * @param lc the #LinphoneCore
+ * @param resource the resource uri for the event
+ * @param event the event name
+ * @param expires the lifetime of event being published, -1 if no associated duration, in which case it will not be refreshed.
+ * @return the #LinphoneEvent holding the context of the publish.
+**/
+LINPHONE_PUBLIC LinphoneEvent *linphone_core_create_publish(LinphoneCore *lc, const LinphoneAddress *resource, const char *event, int expires);
+
+/**
+ * Create a publish context for a one-shot publish.
+ * After being created, the publish must be sent using linphone_event_send_publish().
+ * The #LinphoneEvent is automatically terminated when the publish transaction is finished, either with success or failure.
+ * The application must not call linphone_event_terminate() for such one-shot publish.
+ * @param lc the #LinphoneCore
+ * @param resource the resource uri for the event
+ * @param event the event name
+ * @return the #LinphoneEvent holding the context of the publish.
+**/
+LINPHONE_PUBLIC LinphoneEvent *linphone_core_create_one_shot_publish(LinphoneCore *lc, const LinphoneAddress *resource, const char *event);
+
+/**
+ * @}
+ */
+
+
+/**
+ * @addtogroup buddy_list
+ * @{
+ */
+
+/**
+ * Create a default LinphoneFriend.
+ * @param[in] lc #LinphoneCore object
+ * @return The created #LinphoneFriend object
+ */
+LINPHONE_PUBLIC LinphoneFriend * linphone_core_create_friend(LinphoneCore *lc);
+
+/**
+ * Create a #LinphoneFriend from the given address.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] address A string containing the address to create the #LinphoneFriend from
+ * @return The created #LinphoneFriend object
+ */
+LINPHONE_PUBLIC LinphoneFriend * linphone_core_create_friend_with_address(LinphoneCore *lc, const char *address);
+
+/**
+ * Set my presence status
+ * @param[in] lc #LinphoneCore object
+ * @param[in] minutes_away how long in away
+ * @param[in] alternative_contact sip uri used to redirect call in state #LinphoneStatusMoved
+ * @param[in] os #LinphoneOnlineStatus
+ * @deprecated Use linphone_core_set_presence_model() instead
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_set_presence_info(LinphoneCore *lc,int minutes_away,const char *alternative_contact,LinphoneOnlineStatus os);
+
+/**
+ * Set my presence model
+ * @param[in] lc #LinphoneCore object
+ * @param[in] presence #LinphonePresenceModel
+ */
+LINPHONE_PUBLIC void linphone_core_set_presence_model(LinphoneCore *lc, LinphonePresenceModel *presence);
+
+/**
+ * Get my presence status
+ * @param[in] lc #LinphoneCore object
+ * @return #LinphoneOnlineStatus
+ * @deprecated Use linphone_core_get_presence_model() instead
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneOnlineStatus linphone_core_get_presence_info(const LinphoneCore *lc);
+
+/**
+ * Get my presence model
+ * @param[in] lc #LinphoneCore object
+ * @return A #LinphonePresenceModel object, or NULL if no presence model has been set.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_core_get_presence_model(const LinphoneCore *lc);
+
+/**
+ * Get my consolidated presence
+ * @param[in] lc #LinphoneCore object
+ * @return My consolidated presence
+ */
+LINPHONE_PUBLIC LinphoneConsolidatedPresence linphone_core_get_consolidated_presence(const LinphoneCore *lc);
+
+/**
+ * Set my consolidated presence
+ * @param[in] lc #LinphoneCore object
+ * @param[in] presence #LinphoneConsolidatedPresence value
+ */
+LINPHONE_PUBLIC void linphone_core_set_consolidated_presence(LinphoneCore *lc, LinphoneConsolidatedPresence presence);
+
+/**
+ * @deprecated Use linphone_core_interpret_url() instead
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_interpret_friend_uri(LinphoneCore *lc, const char *uri, char **result);
+
+/**
+ * Add a friend to the current buddy list, if \link linphone_friend_enable_subscribes() subscription attribute \endlink is set, a SIP SUBSCRIBE message is sent.
+ * @param lc #LinphoneCore object
+ * @param fr #LinphoneFriend to add
+ * @deprecated use linphone_friend_list_add_friend() instead.
+ */
+LINPHONE_PUBLIC	void linphone_core_add_friend(LinphoneCore *lc, LinphoneFriend *fr);
+
+/**
+ * Removes a friend from the buddy list
+ * @param lc #LinphoneCore object
+ * @param fr #LinphoneFriend to remove
+ * @deprecated use linphone_friend_list_remove_friend() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_core_remove_friend(LinphoneCore *lc, LinphoneFriend *fr);
+
+/**
+ * Black list a friend. same as linphone_friend_set_inc_subscribe_policy() with #LinphoneSPDeny policy;
+ * @param lc #LinphoneCore object
+ * @param lf #LinphoneFriend to add
+ */
+LINPHONE_PUBLIC void linphone_core_reject_subscriber(LinphoneCore *lc, LinphoneFriend *lf);
+
+/**
+ * Get Buddy list of #LinphoneFriend
+ * @param[in] lc #LinphoneCore object
+ * @return \bctbx_list{LinphoneFriend}
+ * @deprecated use linphone_core_get_friends_lists() or linphone_friend_list_get_friends() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC	LINPHONE_DEPRECATED  const bctbx_list_t * linphone_core_get_friend_list(const LinphoneCore *lc);
+
+/**
+ * Notify all friends that have subscribed
+ * @param lc #LinphoneCore object
+ * @param presence #LinphonePresenceModel to notify
+ */
+LINPHONE_PUBLIC void linphone_core_notify_all_friends(LinphoneCore *lc, LinphonePresenceModel *presence);
+
+/**
+ * Search a #LinphoneFriend by its address.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] addr The address to use to search the friend.
+ * @return The #LinphoneFriend object corresponding to the given address.
+ * @deprecated use linphone_core_find_friend() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneFriend *linphone_core_get_friend_by_address(const LinphoneCore *lc, const char *addr);
+
+/**
+ * Search a #LinphoneFriend by its address.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] addr The address to use to search the friend.
+ * @return The #LinphoneFriend object corresponding to the given address.
+ */
+LINPHONE_PUBLIC LinphoneFriend *linphone_core_find_friend(const LinphoneCore *lc, const LinphoneAddress *addr);
+
+/**
+ * Search all #LinphoneFriend matching an address.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] addr The address to use to search the friends.
+ * @return \bctbx_list{LinphoneFriend} a list of #LinphoneFriend corresponding to the given address.
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_core_find_friends(const LinphoneCore *lc, const LinphoneAddress *addr);
+
+/**
+ * Search a #LinphoneFriend by its reference key.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] key The reference key to use to search the friend.
+ * @return The #LinphoneFriend object corresponding to the given reference key.
+ */
+LINPHONE_PUBLIC LinphoneFriend *linphone_core_get_friend_by_ref_key(const LinphoneCore *lc, const char *key);
+
+/**
+ * Sets the database filename where friends will be stored.
+ * If the file does not exist, it will be created.
+ * @ingroup initializing
+ * @param lc the linphone core
+ * @param path filesystem path
+**/
+LINPHONE_PUBLIC void linphone_core_set_friends_database_path(LinphoneCore *lc, const char *path);
+
+/**
+ * Gets the database filename where friends will be stored.
+ * @ingroup initializing
+ * @param lc the linphone core
+ * @return filesystem path
+**/
+LINPHONE_PUBLIC const char* linphone_core_get_friends_database_path(LinphoneCore *lc);
+
+/**
+ * Create a new empty #LinphoneFriendList object.
+ * @param[in] lc #LinphoneCore object.
+ * @return A new #LinphoneFriendList object.
+**/
+LINPHONE_PUBLIC LinphoneFriendList * linphone_core_create_friend_list(LinphoneCore *lc);
+
+/**
+ * Add a friend list.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] list #LinphoneFriendList object
+ */
+LINPHONE_PUBLIC void linphone_core_add_friend_list(LinphoneCore *lc, LinphoneFriendList *list);
+
+/**
+ * Removes a friend list.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] list #LinphoneFriendList object
+ */
+LINPHONE_PUBLIC void linphone_core_remove_friend_list(LinphoneCore *lc, LinphoneFriendList *list);
+
+/**
+ * Retrieves the list of #LinphoneFriendList from the core.
+ * @param[in] lc #LinphoneCore object
+ * @return \bctbx_list{LinphoneFriendList} a list of #LinphoneFriendList
+ */
+LINPHONE_PUBLIC const bctbx_list_t * linphone_core_get_friends_lists(const LinphoneCore *lc);
+
+/**
+ * Retrieves the first list of #LinphoneFriend from the core.
+ * @param[in] lc #LinphoneCore object
+ * @return the first #LinphoneFriendList object or NULL
+ */
+LINPHONE_PUBLIC LinphoneFriendList * linphone_core_get_default_friend_list(const LinphoneCore *lc);
+
+/**
+ * Retrieves the list of #LinphoneFriend from the core that has the given display name.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] name the name of the list
+ * @return the first #LinphoneFriendList object or NULL
+ */
+LINPHONE_PUBLIC LinphoneFriendList* linphone_core_get_friend_list_by_name(const LinphoneCore *lc, const char *name);
+
+/**
+ * Sets whether or not to start friend lists subscription when in foreground
+ * @param[in] lc The #LinphoneCore
+ * @param[in] enable whether or not to enable the feature
+**/
+LINPHONE_PUBLIC void linphone_core_enable_friend_list_subscription(LinphoneCore *lc, bool_t enable);
+
+/**
+ * Returns whether or not friend lists subscription are enabled
+ * @param[in] lc The #LinphoneCore
+ * @return whether or not the feature is enabled
+**/
+LINPHONE_PUBLIC bool_t linphone_core_is_friend_list_subscription_enabled(LinphoneCore *lc);
+
+/**
+ * Retrieves a list of #LinphoneAddress sort and filter
+ * @param[in] lc #LinphoneCore object
+ * @param[in] filter Chars used for the filter*
+ * @param[in] sip_only Only sip address or not
+ * @return \bctbx_list{LinphoneAddress} a list of filtered #LinphoneAddress + the #LinphoneAddress created with the filter
+**/
+LINPHONE_PUBLIC const bctbx_list_t * linphone_core_find_contacts_by_char(LinphoneCore *core, const char *filter, bool_t sip_only);
+
+/**
+ * Create a #LinphonePresenceActivity with the given type and description.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] acttype The #LinphonePresenceActivityType to set for the activity.
+ * @param[in] description An additional description of the activity to set for the activity. Can be NULL if no additional description is to be added.
+ * @return The created #LinphonePresenceActivity object.
+ */
+LINPHONE_PUBLIC LinphonePresenceActivity * linphone_core_create_presence_activity(LinphoneCore *lc, LinphonePresenceActivityType acttype, const char *description);
+
+/**
+ * Create a default LinphonePresenceModel.
+ * @param[in] lc #LinphoneCore object.
+ * @return The created #LinphonePresenceModel object.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_core_create_presence_model(LinphoneCore *lc);
+
+/**
+ * Create a #LinphonePresenceModel with the given activity type and activity description.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] acttype The #LinphonePresenceActivityType to set for the activity of the created model.
+ * @param[in] description An additional description of the activity to set for the activity. Can be NULL if no additional description is to be added.
+ * @return The created #LinphonePresenceModel object.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_core_create_presence_model_with_activity(LinphoneCore *lc, LinphonePresenceActivityType acttype, const char *description);
+
+/**
+ * Create a #LinphonePresenceModel with the given activity type, activity description, note content and note language.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] acttype The #LinphonePresenceActivityType to set for the activity of the created model.
+ * @param[in] description An additional description of the activity to set for the activity. Can be NULL if no additional description is to be added.
+ * @param[in] note The content of the note to be added to the created model.
+ * @param[in] lang The language of the note to be added to the created model.
+ * @return The created #LinphonePresenceModel object.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_core_create_presence_model_with_activity_and_note(LinphoneCore *lc, LinphonePresenceActivityType acttype, const char *description, const char *note, const char *lang);
+
+/**
+ * Create a #LinphonePresenceNote with the given content and language.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] content The content of the note to be created.
+ * @param[in] lang The language of the note to be created.
+ * @return The created #LinphonePresenceNote object.
+ */
+LINPHONE_PUBLIC LinphonePresenceNote * linphone_core_create_presence_note(LinphoneCore *lc, const char *content, const char *lang);
+
+/**
+ * Create a #LinphonePresencePerson with the given id.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] id The id of the person to be created.
+ * @return The created #LinphonePresencePerson object.
+ */
+LINPHONE_PUBLIC LinphonePresencePerson * linphone_core_create_presence_person(LinphoneCore *lc, const char *id);
+
+/**
+ * Create a #LinphonePresenceService with the given id, basic status and contact.
+ * @param[in] lc #LinphoneCore object.
+ * @param[in] id The id of the service to be created.
+ * @param[in] basic_status The basic status of the service to be created.
+ * @param[in] contact A string containing a contact information corresponding to the service to be created.
+ * @return The created #LinphonePresenceService object.
+ */
+LINPHONE_PUBLIC LinphonePresenceService * linphone_core_create_presence_service(LinphoneCore *lc, const char *id, LinphonePresenceBasicStatus basic_status, const char *contact);
+
+
+/**
+ * Notifies the upper layer that a presence status has been received by calling the appropriate
+ * callback if one has been set.
+ * This method is for advanced usage, where customization of the liblinphone's internal behavior is required.
+ * @param[in]  lc the #LinphoneCore object.
+ * @param[in]  lf the #LinphoneFriend whose presence information has been received.
+ */
+LINPHONE_PUBLIC void linphone_core_notify_notify_presence_received(LinphoneCore *lc, LinphoneFriend *lf);
+
+
+/**
+ * Notifies the upper layer that a presence model change has been received for the uri or
+ * telephone number given as a parameter, by calling the appropriate callback if one has been set.
+ * This method is for advanced usage, where customization of the liblinphone's internal behavior is required.
+ * @param[in]  lc  the #LinphoneCore object.
+ * @param[in]  lf  the #LinphoneFriend whose presence information has been received.
+ * @param[in]  uri_or_tel  telephone number or sip uri
+ * @param[in]  presence_model the #LinphonePresenceModel that has been modified
+ */
+LINPHONE_PUBLIC void linphone_core_notify_notify_presence_received_for_uri_or_tel(LinphoneCore *lc, LinphoneFriend *lf, const char *uri_or_tel, const LinphonePresenceModel *presence_model);
+
+/**
+ * Sets the size under which incoming files in chat messages will be downloaded automatically.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] size The size in bytes, -1 to disable the autodownload feature, 0 to download them all no matter the size
+ * @ingroup chat
+**/
+LINPHONE_PUBLIC void linphone_core_set_max_size_for_auto_download_incoming_files(LinphoneCore *lc, int size);
+
+/**
+ * Gets the size under which incoming files in chat messages will be downloaded automatically.
+ * @param[in] lc #LinphoneCore object
+ * @return The size in bytes, -1 if autodownload feature is disabled, 0 to download them all no matter the size
+ * @ingroup chat
+**/
+LINPHONE_PUBLIC int linphone_core_get_max_size_for_auto_download_incoming_files(LinphoneCore *lc);
+
+/**
+ * @}
+ */
+
+
+/**
+ * Create a new #LinphoneNatPolicy object with every policies being disabled.
+ * @param[in] lc #LinphoneCore object
+ * @return A new #LinphoneNatPolicy object.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC LinphoneNatPolicy * linphone_core_create_nat_policy(LinphoneCore *lc);
+
+/**
+ * Create a new #LinphoneNatPolicy by reading the config of a #LinphoneCore according to the passed ref.
+ * @param[in] lc #LinphoneCore object
+ * @param[in] ref The reference of a NAT policy in the config of the #LinphoneCore
+ * @return A new #LinphoneNatPolicy object.
+ * @ingroup network_parameters
+ */
+LINPHONE_PUBLIC LinphoneNatPolicy * linphone_core_create_nat_policy_from_config(LinphoneCore *lc, const char *ref);
+
+
+/**
+ * Create a #LinphoneAccountCreator and set Linphone Request callbacks.
+ * @param[in] core The #LinphoneCore used for the XML-RPC communication
+ * @param[in] xmlrpc_url The URL to the XML-RPC server. Must be NON NULL.
+ * @return The new #LinphoneAccountCreator object.
+ * @ingroup account_creator
+**/
+LINPHONE_PUBLIC LinphoneAccountCreator * linphone_core_create_account_creator(LinphoneCore *core, const char *xmlrpc_url);
+
+/**
+ * Create a #LinphoneXmlRpcSession for a given url.
+ * @param[in] lc The #LinphoneCore used for the XML-RPC communication
+ * @param[in] url The URL to the XML-RPC server. Must be NON NULL.
+ * @return The new #LinphoneXmlRpcSession object.
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcSession * linphone_core_create_xml_rpc_session(LinphoneCore *lc, const char *url);
+
+/**
+ * Update current config with the content of a xml config file
+ * @param[in] lc The #LinphoneCore to update
+ * @param[in] xml_uri the path to the xml file
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC void linphone_core_load_config_from_xml(LinphoneCore *lc, const char * xml_uri);
+
+/**
+ * Call this method when you receive a push notification.
+ * It will ensure the proxy configs are correctly registered to the proxy server,
+ * so the call or the message will be correctly delivered.
+ * @param[in] lc The #LinphoneCore
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC void linphone_core_ensure_registered(LinphoneCore *lc);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/core_utils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/core_utils.h"
new file mode 100644
index 0000000..f86d07e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/core_utils.h"
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_CORE_UTILS_H_
+#define LINPHONE_CORE_UTILS_H_
+
+
+#include "linphone/logging.h"
+#include "linphone/types.h"
+#include "linphone/callbacks.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*LsdEndOfPlayCallback)(LsdPlayer *p);
+
+LINPHONE_PUBLIC void lsd_player_set_callback(LsdPlayer *p, LsdEndOfPlayCallback cb);
+LINPHONE_PUBLIC void lsd_player_set_user_pointer(LsdPlayer *p, void *up);
+LINPHONE_PUBLIC void *lsd_player_get_user_pointer(const LsdPlayer *p);
+LINPHONE_PUBLIC LinphoneStatus lsd_player_play(LsdPlayer *p, const char *filename);
+LINPHONE_PUBLIC LinphoneStatus lsd_player_stop(LsdPlayer *p);
+LINPHONE_PUBLIC void lsd_player_enable_loop(LsdPlayer *p, bool_t loopmode);
+LINPHONE_PUBLIC bool_t lsd_player_loop_enabled(const LsdPlayer *p);
+LINPHONE_PUBLIC void lsd_player_set_gain(LsdPlayer *p, float gain);
+LINPHONE_PUBLIC LinphoneSoundDaemon *lsd_player_get_daemon(const LsdPlayer *p);
+
+LINPHONE_PUBLIC LinphoneSoundDaemon * linphone_sound_daemon_new(MSFactory* factory, const char *cardname, int rate, int nchannels);
+LINPHONE_PUBLIC LsdPlayer * linphone_sound_daemon_get_player(LinphoneSoundDaemon *lsd);
+LINPHONE_PUBLIC void linphone_sound_daemon_release_player(LinphoneSoundDaemon *lsd, LsdPlayer *lsdplayer);
+LINPHONE_PUBLIC void linphone_sound_daemon_stop_all_players(LinphoneSoundDaemon *obj);
+LINPHONE_PUBLIC void linphone_sound_daemon_release_all_players(LinphoneSoundDaemon *obj);
+LINPHONE_PUBLIC void linphone_core_use_sound_daemon(LinphoneCore *lc, LinphoneSoundDaemon *lsd);
+LINPHONE_PUBLIC void linphone_sound_daemon_destroy(LinphoneSoundDaemon *obj);
+
+
+/*These typedefs are deprecated, but we don't mark them LINPHONE_DEPRECATED otherwise we get deprecation warnings with
+ * the deprecated linphone_core_start_echo_calibration() that make use of them*/
+typedef void (*LinphoneEcCalibrationCallback)(LinphoneCore *lc, LinphoneEcCalibratorStatus status, int delay_ms, void *data);
+typedef void (*LinphoneEcCalibrationAudioInit)(void *data);
+typedef void (*LinphoneEcCalibrationAudioUninit)(void *data);
+
+/**
+ * @brief Starts an echo calibration of the sound devices, in order to find adequate settings for the echo canceler automatically.
+ * @deprecated Use #linphone_core_start_echo_canceller_calibration() instead. To set the callbacks create or get an already instantiated
+ * #LinphoneCoreCbs and call #linphone_core_cbs_set_ec_calibration_result(), #linphone_core_cbs_set_ec_calibration_audio_init() and
+ * #linphone_core_cbs_set_ec_callibration_audio_uninit(). Deprecated since 2017-10-16.
+ * @ingroup misc
+ * @donotwrap
+**/
+LINPHONE_DEPRECATED LINPHONE_PUBLIC int linphone_core_start_echo_calibration(LinphoneCore *lc, LinphoneEcCalibrationCallback cb,
+					 LinphoneEcCalibrationAudioInit audio_init_cb, LinphoneEcCalibrationAudioUninit audio_uninit_cb, void *cb_data);
+
+/**
+ * @brief Starts an echo calibration of the sound devices, in order to find adequate settings for the echo canceler automatically.
+ * @param[in] lc #LinphoneCore object.
+ * @return #LinphoneStatus whether calibration has started or not.
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_start_echo_canceller_calibration(LinphoneCore *lc);
+
+/**
+ * Start the simulation of call to test the latency with an external device
+ * @param lc The core.
+ * @param rate Sound sample rate.
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_start_echo_tester(LinphoneCore *lc, unsigned int rate);
+
+/**
+ * Stop the simulation of call
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_core_stop_echo_tester(LinphoneCore *lc);
+
+/**
+ * Check whether the device is flagged has crappy opengl
+ * @returns TRUE if crappy opengl flag is set, FALSE otherwise
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC bool_t linphone_core_has_crappy_opengl(LinphoneCore *lc);
+
+/**
+ * Check whether the device has a hardware echo canceller
+ * @returns TRUE if it does, FALSE otherwise
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC bool_t linphone_core_has_builtin_echo_canceller(LinphoneCore *lc);
+
+/**
+ * Check whether the device is echo canceller calibration is required
+ * @returns TRUE if it is required, FALSE otherwise
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC bool_t linphone_core_is_echo_canceller_calibration_required(LinphoneCore *lc);
+
+/**
+ * @ingroup IOS
+ * Special function to warm up  dtmf feeback stream. #linphone_core_stop_dtmf_stream must() be called before entering FG mode
+ */
+LINPHONE_PUBLIC void linphone_core_start_dtmf_stream(LinphoneCore* lc);
+/**
+ * @ingroup IOS
+ * Special function to stop dtmf feed back function. Must be called before entering BG mode
+ */
+LINPHONE_PUBLIC void linphone_core_stop_dtmf_stream(LinphoneCore* lc);
+
+
+typedef bool_t (*LinphoneCoreIterateHook)(void *data);
+
+LINPHONE_PUBLIC void linphone_core_add_iterate_hook(LinphoneCore *lc, LinphoneCoreIterateHook hook, void *hook_data);
+
+LINPHONE_PUBLIC void linphone_core_remove_iterate_hook(LinphoneCore *lc, LinphoneCoreIterateHook hook, void *hook_data);
+
+LINPHONE_PUBLIC const bctbx_list_t *linphone_player_get_callbacks_list(const LinphonePlayer *player);
+LINPHONE_PUBLIC const bctbx_list_t *linphone_event_get_callbacks_list(const LinphoneEvent *ev);
+LINPHONE_PUBLIC const bctbx_list_t *linphone_friend_list_get_callbacks_list(const LinphoneFriendList *friend_list);
+LINPHONE_PUBLIC const bctbx_list_t *linphone_logging_service_get_callbacks_list(const LinphoneLoggingService *log_service);
+LINPHONE_PUBLIC const bctbx_list_t *linphone_account_creator_get_callbacks_list(const LinphoneAccountCreator *creator);
+LINPHONE_PUBLIC const bctbx_list_t *linphone_xml_rpc_request_get_callbacks_list(const LinphoneXmlRpcRequest *request);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_CORE_UTILS_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/defs.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/defs.h"
new file mode 100644
index 0000000..28a982b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/defs.h"
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_DEFS_H_
+#define LINPHONE_DEFS_H_
+
+
+#include "mediastreamer2/mscommon.h"
+
+
+#define LINPHONE_IPADDR_SIZE 64
+#define LINPHONE_HOSTNAME_SIZE 128
+
+#ifndef LINPHONE_PUBLIC
+#if defined(_MSC_VER)
+#ifdef LINPHONE_STATIC
+#define LINPHONE_PUBLIC
+#else
+#ifdef LINPHONE_EXPORTS
+#define LINPHONE_PUBLIC	__declspec(dllexport)
+#else
+#define LINPHONE_PUBLIC	__declspec(dllimport)
+#endif
+#endif
+#else
+#define LINPHONE_PUBLIC
+#endif
+#endif
+
+
+#ifndef LINPHONE_DEPRECATED
+#define LINPHONE_DEPRECATED MS2_DEPRECATED
+#endif
+
+
+#endif /* LINPHONE_DEFS_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/dictionary.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/dictionary.h"
new file mode 100644
index 0000000..2a82725
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/dictionary.h"
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_DICTIONARY_H
+#define LINPHONE_DICTIONARY_H
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LINPHONE_PUBLIC LinphoneDictionary* linphone_dictionary_new(void);
+
+LINPHONE_PUBLIC LinphoneDictionary * linphone_dictionary_clone(const LinphoneDictionary* src);
+
+LINPHONE_PUBLIC LinphoneDictionary * linphone_dictionary_ref(LinphoneDictionary* obj);
+
+LINPHONE_PUBLIC void linphone_dictionary_unref(LinphoneDictionary* obj);
+
+LINPHONE_PUBLIC void linphone_dictionary_set_int(LinphoneDictionary* obj, const char* key, int value);
+
+LINPHONE_PUBLIC int linphone_dictionary_get_int(LinphoneDictionary* obj, const char* key, int default_value);
+
+LINPHONE_PUBLIC void linphone_dictionary_set_string(LinphoneDictionary* obj, const char* key, const char*value);
+
+LINPHONE_PUBLIC const char* linphone_dictionary_get_string(LinphoneDictionary* obj, const char* key, const char* default_value);
+
+LINPHONE_PUBLIC void linphone_dictionary_set_int64(LinphoneDictionary* obj, const char* key, int64_t value);
+
+LINPHONE_PUBLIC int64_t linphone_dictionary_get_int64(LinphoneDictionary* obj, const char* key, int64_t default_value);
+
+LINPHONE_PUBLIC LinphoneStatus linphone_dictionary_remove(LinphoneDictionary* obj, const char* key);
+
+LINPHONE_PUBLIC void linphone_dictionary_clear(LinphoneDictionary* obj);
+
+LINPHONE_PUBLIC LinphoneStatus linphone_dictionary_haskey(const LinphoneDictionary* obj, const char* key);
+
+LINPHONE_PUBLIC void linphone_dictionary_foreach( const LinphoneDictionary* obj, void (*apply_func)(const char*key, void* value, void* userdata), void* userdata);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_DICTIONARY_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/call-enums.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/call-enums.h"
new file mode 100644
index 0000000..f408c1e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/call-enums.h"
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_CALL_ENUMS_H_
+#define _L_CALL_ENUMS_H_
+
+// =============================================================================
+
+#define L_ENUM_VALUES_CALL_SESSION_STATE(F) \
+	F(Idle /**< Initial state */) \
+	F(IncomingReceived /**< Incoming call received */) \
+	F(OutgoingInit /**< Outgoing call initialized */) \
+	F(OutgoingProgress /**< Outgoing call in progress */) \
+	F(OutgoingRinging /**< Outgoing call ringing */) \
+	F(OutgoingEarlyMedia /**< Outgoing call early media */) \
+	F(Connected /**< Connected */) \
+	F(StreamsRunning /**< Streams running */) \
+	F(Pausing /**< Pausing */) \
+	F(Paused /**< Paused */) \
+	F(Resuming /**< Resuming */) \
+	F(Referred /**< Referred */) \
+	F(Error /**< Error */) \
+	F(End /**< Call end */) \
+	F(PausedByRemote /**< Paused by remote */) \
+	F(UpdatedByRemote /**< The call&apos;s parameters are updated for example when video is asked by remote */) \
+	F(IncomingEarlyMedia /**< We are proposing early media to an incoming call */) \
+	F(Updating /**< We have initiated a call update */) \
+	F(Released /**< The call object is now released */) \
+	F(EarlyUpdatedByRemote /**< The call is updated by remote while not yet answered (SIP UPDATE in early dialog received) */) \
+	F(EarlyUpdating /**< We are updating the call while not yet answered (SIP UPDATE in early dialog sent) */)
+
+// =============================================================================
+// DEPRECATED
+// =============================================================================
+
+#define LinphoneCallIdle LinphoneCallStateIdle
+#define LinphoneCallIncomingReceived LinphoneCallStateIncomingReceived
+#define LinphoneCallOutgoingInit LinphoneCallStateOutgoingInit
+#define LinphoneCallOutgoingProgress LinphoneCallStateOutgoingProgress
+#define LinphoneCallOutgoingRinging LinphoneCallStateOutgoingRinging
+#define LinphoneCallOutgoingEarlyMedia LinphoneCallStateOutgoingEarlyMedia
+#define LinphoneCallConnected LinphoneCallStateConnected
+#define LinphoneCallStreamsRunning LinphoneCallStateStreamsRunning
+#define LinphoneCallPausing LinphoneCallStatePausing
+#define LinphoneCallPaused LinphoneCallStatePaused
+#define LinphoneCallResuming LinphoneCallStateResuming
+#define LinphoneCallRefered LinphoneCallStateReferred
+#define LinphoneCallError LinphoneCallStateError
+#define LinphoneCallEnd LinphoneCallStateEnd
+#define LinphoneCallPausedByRemote LinphoneCallStatePausedByRemote
+#define LinphoneCallUpdatedByRemote LinphoneCallStateUpdatedByRemote
+#define LinphoneCallIncomingEarlyMedia LinphoneCallStateIncomingEarlyMedia
+#define LinphoneCallUpdating LinphoneCallStateUpdating
+#define LinphoneCallReleased LinphoneCallStateReleased
+#define LinphoneCallEarlyUpdatedByRemote LinphoneCallStateEarlyUpdatedByRemote
+#define LinphoneCallEarlyUpdating LinphoneCallStateEarlyUpdating
+
+#endif // ifndef _L_CALL_ENUMS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/chat-message-enums.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/chat-message-enums.h"
new file mode 100644
index 0000000..7f5b730
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/chat-message-enums.h"
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_CHAT_MESSAGE_ENUMS_H_
+#define _L_CHAT_MESSAGE_ENUMS_H_
+
+// =============================================================================
+
+#define L_ENUM_VALUES_CHAT_MESSAGE_STATE(F) \
+	F(Idle /**< Initial state */) \
+	F(InProgress /**< Delivery in progress */) \
+	F(Delivered /**< Message successfully delivered and acknowledged by the server */) \
+	F(NotDelivered /**< Message was not delivered */) \
+	F(FileTransferError /**< Message was received and acknowledged but cannot get file from server */) \
+	F(FileTransferDone /**< File transfer has been completed successfully */) \
+	F(DeliveredToUser /**< Message successfully delivered an acknowledged by the remote user */) \
+	F(Displayed /**< Message successfully displayed to the remote user */) \
+	F(FileTransferInProgress /** <File transfer is in progress. If message is incoming it's a download, otherwise it's an upload. */)
+
+#define L_ENUM_VALUES_CHAT_MESSAGE_DIRECTION(F) \
+	F(Incoming /**< Incoming message */) \
+	F(Outgoing /**< Outgoing message */)
+
+#endif // ifndef _L_CHAT_MESSAGE_ENUMS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/chat-room-enums.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/chat-room-enums.h"
new file mode 100644
index 0000000..671e558
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/chat-room-enums.h"
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_CHAT_ROOM_ENUMS_H_
+#define _L_CHAT_ROOM_ENUMS_H_
+
+// =============================================================================
+
+#define L_ENUM_VALUES_CHAT_ROOM_STATE(F) \
+	F(None /**< Initial state */) \
+	F(Instantiated /**< Chat room is now instantiated on local */) \
+	F(CreationPending /**< One creation request was sent to the server */) \
+	F(Created /**< Chat room was created on the server */) \
+	F(CreationFailed /**< Chat room creation failed */) \
+	F(TerminationPending /**< Wait for chat room termination */) \
+	F(Terminated /**< Chat room exists on server but not in local */) \
+	F(TerminationFailed /**< The chat room termination failed */) \
+	F(Deleted /**< Chat room was deleted on the server */)
+
+//To be deprecated
+#define L_ENUM_VALUES_CHAT_ROOM_CAPABILITIES(F) \
+	F(None /**< No capabilities. */, 0) \
+	F(Basic /**< No server. It&apos;s a direct communication */, 1 << 0) \
+	F(RealTimeText /**< Supports RTT */, 1 << 1) \
+	F(Conference /**< Use server (supports group chat) */, 1 << 2) \
+	F(Proxy /**< Special proxy chat room flag */, 1 << 3) \
+	F(Migratable /**< Chat room migratable from Basic to Conference */, 1 << 4) \
+	F(OneToOne /**< A communication between two participants (can be Basic or Conference) */, 1 << 5) \
+	F(Encrypted /**< Chat room is encrypted */, 1 << 6)
+
+#define L_ENUM_VALUES_CHAT_ROOM_BACKEND(F) \
+	F(Basic /**< Basic (client-to-client) chat room. */, 1 << 0) \
+	F(FlexisipChat /**< Server-based chat room. */, 1 << 1)
+
+#define L_ENUM_VALUES_CHAT_ROOM_ENCRYPTION_BACKEND(F) \
+	F(None /**< No encryption. */, 0) \
+	F(Lime /**< Lime x3dh encryption. */, 1 << 0)
+
+#endif // ifndef _L_CHAT_ROOM_ENUMS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/encryption-engine-enums.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/encryption-engine-enums.h"
new file mode 100644
index 0000000..93765e9
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/encryption-engine-enums.h"
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_ENCRYPTION_ENGINE_ENUMS_H_
+#define _L_ENCRYPTION_ENGINE_ENUMS_H_
+
+// =============================================================================
+
+#define L_ENUM_VALUES_ENCRYPTION_ENGINE_SECURITY_LEVEL(F) \
+	F(Unsafe /**< Security failure */) \
+	F(ClearText /**< No encryption */) \
+	F(Encrypted /**< Encrypted */) \
+	F(Safe /**< Encrypted and verified */)
+
+#endif // ifndef _L_ENCRYPTION_ENGINE_ENUMS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/event-log-enums.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/event-log-enums.h"
new file mode 100644
index 0000000..d57a4d5
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/event-log-enums.h"
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_EVENT_LOG_ENUMS_H_
+#define _L_EVENT_LOG_ENUMS_H_
+
+// =============================================================================
+
+#define L_ENUM_VALUES_EVENT_LOG_TYPE(F) \
+	F(None /**< No defined event */) \
+	F(ConferenceCreated /**< Conference (created) event */) \
+	F(ConferenceTerminated /**< Conference (terminated) event */) \
+	F(ConferenceCallStart /**< Conference call (start) event */) \
+	F(ConferenceCallEnd /**< Conference call (end) event */) \
+	F(ConferenceChatMessage /**< Conference chat message event */) \
+	F(ConferenceParticipantAdded /**< Conference participant (added) event */) \
+	F(ConferenceParticipantRemoved /**< Conference participant (removed) event */) \
+	F(ConferenceParticipantSetAdmin /**< Conference participant (set admin) event */) \
+	F(ConferenceParticipantUnsetAdmin /**< Conference participant (unset admin) event */) \
+	F(ConferenceParticipantDeviceAdded /**< Conference participant device (added) event */) \
+	F(ConferenceParticipantDeviceRemoved /**< Conference participant device (removed) event */) \
+	F(ConferenceSubjectChanged /**< Conference subject event */) \
+	F(ConferenceSecurityEvent /**< Conference encryption security event*/) \
+
+#endif // ifndef _L_EVENT_LOG_ENUMS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/security-event-enums.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/security-event-enums.h"
new file mode 100644
index 0000000..2af9765
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/enums/security-event-enums.h"
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_SECURITY_EVENT_ENUMS_H_
+#define _L_SECURITY_EVENT_ENUMS_H_
+
+// =============================================================================
+
+#define L_ENUM_VALUES_SECURITY_EVENT_TYPE(F) \
+	F(None /**< Event is not a security event */) \
+	F(SecurityLevelDowngraded /**< Chatroom security level downgraded event */) \
+	F(ParticipantMaxDeviceCountExceeded /**< Participant has exceeded the maximum number of device event */) \
+	F(EncryptionIdentityKeyChanged /**< Peer device instant messaging encryption identity key has changed event */) \
+	F(ManInTheMiddleDetected /**< Man in the middle detected event */) \
+
+#endif // ifndef _L_SECURITY_EVENT_ENUMS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/error_info.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/error_info.h"
new file mode 100644
index 0000000..ac017f2
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/error_info.h"
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_ERROR_INFO_H
+#define LINPHONE_ERROR_INFO_H
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Create an empty #LinphoneErrorInfo object.
+ * The #LinphoneErrorInfo object carries these fields:
+ * - a #LinphoneReason enum member giving overall signification of the error reported.
+ * - the "protocol" name in which the protocol reason code has meaning, for example SIP or Q.850
+ * - the "protocol code", an integer referencing the kind of error reported
+ * - the "phrase", a text phrase describing the error
+ * - the "warning", the content of warning headers if any
+ * - a sub "LinphoneErrorInfo" may be provided if a SIP response includes a Reason header (RFC3326).
+**/
+LINPHONE_PUBLIC LinphoneErrorInfo *linphone_error_info_new(void);
+
+/**
+ * Increment refcount.
+ * @param[in] ei ErrorInfo object
+**/
+LINPHONE_PUBLIC LinphoneErrorInfo *linphone_error_info_ref(LinphoneErrorInfo *ei);
+
+/**
+ * Decrement refcount and possibly free the object.
+ * @param[in] ei ErrorInfo object
+**/
+LINPHONE_PUBLIC void linphone_error_info_unref(LinphoneErrorInfo *ei);
+
+/**
+* Get Retry-After delay second from the error info.
+* @param[in] ei ErrorInfo object
+* @return The Retry-After delay second
+**/
+LINPHONE_PUBLIC int linphone_error_info_get_retry_after(const LinphoneErrorInfo *ei);
+
+/**
+ * Get reason code from the error info.
+ * @param[in] ei ErrorInfo object
+ * @return A #LinphoneReason
+**/
+LINPHONE_PUBLIC LinphoneReason linphone_error_info_get_reason(const LinphoneErrorInfo *ei);
+
+/**
+ * Get pointer to chained #LinphoneErrorInfo set in sub_ei.
+ * It corresponds to a Reason header in a received SIP response.
+ * @param  ei ErrorInfo object
+ * @return    #LinphoneErrorInfo pointer defined in the ei object.
+ */
+LINPHONE_PUBLIC LinphoneErrorInfo* linphone_error_info_get_sub_error_info(const LinphoneErrorInfo *ei);
+
+/**
+ * Get textual phrase from the error info.
+ * This is the text that is provided by the peer in the protocol (SIP).
+ * @param[in] ei ErrorInfo object
+ * @return The error phrase
+**/
+LINPHONE_PUBLIC const char * linphone_error_info_get_phrase(const LinphoneErrorInfo *ei);
+	
+/**
+ * Get protocol from the error info.
+ * @param[in]  ei ErrorInfo object
+ * @return    The protocol 
+ */
+LINPHONE_PUBLIC const char *linphone_error_info_get_protocol(const LinphoneErrorInfo *ei);
+
+/**
+ * Provides additional information regarding the failure.
+ * With SIP protocol, the content of "Warning" headers are returned.
+ * @param[in] ei ErrorInfo object
+ * @return More details about the failure
+**/
+LINPHONE_PUBLIC const char * linphone_error_info_get_warnings(const LinphoneErrorInfo *ei);
+
+
+/**
+ * Get the status code from the low level protocol (ex a SIP status code).
+ * @param[in] ei ErrorInfo object
+ * @return The status code
+**/
+LINPHONE_PUBLIC int linphone_error_info_get_protocol_code(const LinphoneErrorInfo *ei);
+
+/**
+ * Assign information to a #LinphoneErrorInfo object.
+ * @param[in] ei 			ErrorInfo object
+ * @param[in] protocol      protocol name
+ * @param[in] reason        reason  from #LinphoneReason enum
+ * @param[in] code          protocol code
+ * @param[in] status_string description of the reason
+ * @param[in] warning       warning message
+ */
+LINPHONE_PUBLIC void linphone_error_info_set(LinphoneErrorInfo *ei, const char *protocol, LinphoneReason reason, int code, const char *status_string, const char *warning);
+	
+/**
+ * Set the sub_ei in #LinphoneErrorInfo to another LinphoneErrorInfo. 
+ * Used when a reason header is to be added in a SIP response. The first level #LinphoneErrorInfo defines the SIP response code and phrase,
+ * the second (sub) #LinphoneErroInfo defining the content of the Reason header.
+ * @param[in] ei 		  #LinphoneErrorInfo object to which the other #LinphoneErrorInfo will be appended as ei->sub_ei.        
+ * @param[in] appended_ei #LinphoneErrorInfo to append 
+ */
+LINPHONE_PUBLIC void linphone_error_info_set_sub_error_info(LinphoneErrorInfo *ei, LinphoneErrorInfo *appended_ei);
+
+/**
+* Assign retry-after value to a #LinphoneErrorInfo object.
+* @param[in] ei     ErrorInfo object
+* @param[in] retry_after the retry-after value
+*/
+LINPHONE_PUBLIC void linphone_error_info_set_retry_after(LinphoneErrorInfo *ei, int retry_after);
+
+/**
+ * Assign reason #LinphoneReason to a #LinphoneErrorInfo object.
+ * @param[in] ei     ErrorInfo object
+ * @param[in] reason reason  from #LinphoneReason enum
+ */
+LINPHONE_PUBLIC void linphone_error_info_set_reason(LinphoneErrorInfo *ei, LinphoneReason reason);
+
+/**
+ * Assign protocol name to a #LinphoneErrorInfo object.
+ * @param[in] ei     ErrorInfo object
+ * @param[in] proto the protocol name
+ */
+LINPHONE_PUBLIC void linphone_error_info_set_protocol(LinphoneErrorInfo *ei, const char *proto);
+
+/**
+ * Assign protocol code to a #LinphoneErrorInfo object.
+ * @param[in] ei     ErrorInfo object
+ * @param[in] code the protocol code
+ */
+LINPHONE_PUBLIC void linphone_error_info_set_protocol_code(LinphoneErrorInfo *ei, int code);
+
+/**
+ * Assign phrase to a #LinphoneErrorInfo object.
+ * @param[in] ei     ErrorInfo object
+ * @param[in] phrase the phrase explaining the error
+ */
+LINPHONE_PUBLIC void linphone_error_info_set_phrase(LinphoneErrorInfo *ei, const char *phrase);
+
+/**
+ * Assign warnings to a #LinphoneErrorInfo object.
+ * @param[in] ei     ErrorInfo object
+ * @param[in] phrase the warnings
+ */
+LINPHONE_PUBLIC void linphone_error_info_set_warnings(LinphoneErrorInfo *ei, const char *warnings);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_ERROR_INFO_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/event.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/event.h"
new file mode 100644
index 0000000..36067e4
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/event.h"
@@ -0,0 +1,286 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_EVENT_H_
+#define LINPHONE_EVENT_H_
+
+#include "linphone/callbacks.h"
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup event_api
+ * @{
+**/
+
+/**
+ * Send a subscription previously created by linphone_core_create_subscribe().
+ * @param ev the #LinphoneEvent
+ * @param body optional content to attach with the subscription.
+ * @return 0 if successful, -1 otherwise.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_event_send_subscribe(LinphoneEvent *ev, const LinphoneContent *body);
+
+/**
+ * Update (refresh) an outgoing subscription, changing the body.
+ * @param lev a #LinphoneEvent
+ * @param body an optional body to include in the subscription update, may be NULL.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_event_update_subscribe(LinphoneEvent *lev, const LinphoneContent *body);
+
+/**
+ * Refresh an outgoing subscription keeping the same body.
+ * @param lev #LinphoneEvent object.
+ * @return 0 if successful, -1 otherwise.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_event_refresh_subscribe(LinphoneEvent *lev);
+
+
+/**
+ * Accept an incoming subcription.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_event_accept_subscription(LinphoneEvent *lev);
+
+/**
+ * Deny an incoming subscription with given reason.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_event_deny_subscription(LinphoneEvent *lev, LinphoneReason reason);
+
+/**
+ * Send a notification.
+ * @param lev a #LinphoneEvent corresponding to an incoming subscription previously received and accepted.
+ * @param body an optional body containing the actual notification data.
+ * @return 0 if successful, -1 otherwise.
+ **/
+LINPHONE_PUBLIC LinphoneStatus linphone_event_notify(LinphoneEvent *lev, const LinphoneContent *body);
+
+/**
+ * Send a publish created by linphone_core_create_publish().
+ * @param lev the #LinphoneEvent
+ * @param body the new data to be published
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_event_send_publish(LinphoneEvent *lev, const LinphoneContent *body);
+
+/**
+ * Update (refresh) a publish.
+ * @param lev the #LinphoneEvent
+ * @param body the new data to be published
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_event_update_publish(LinphoneEvent *lev, const LinphoneContent *body);
+
+/**
+ * Refresh an outgoing publish keeping the same body.
+ * @param lev #LinphoneEvent object.
+ * @return 0 if successful, -1 otherwise.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_event_refresh_publish(LinphoneEvent *lev);
+
+/**
+ * Prevent an event from refreshing its publish.
+ * This is useful to let registrations to expire naturally (or) when the application wants to keep control on when
+ * refreshes are sent.
+ * The refreshing operations can be resumed with linphone_proxy_config_refresh_register().
+ * @param[in] lev #LinphoneEvent object.
+ **/
+LINPHONE_PUBLIC void linphone_event_pause_publish(LinphoneEvent *lev);
+
+/**
+ * Return reason code (in case of error state reached).
+**/
+LINPHONE_PUBLIC LinphoneReason linphone_event_get_reason(const LinphoneEvent *lev);
+
+/**
+ * Get full details about an error occured.
+**/
+LINPHONE_PUBLIC const LinphoneErrorInfo *linphone_event_get_error_info(const LinphoneEvent *lev);
+
+/**
+ * Get subscription state. If the event object was not created by a subscription mechanism, #LinphoneSubscriptionNone is returned.
+**/
+LINPHONE_PUBLIC LinphoneSubscriptionState linphone_event_get_subscription_state(const LinphoneEvent *lev);
+
+/**
+ * Get publish state. If the event object was not created by a publish mechanism, #LinphonePublishNone is returned.
+**/
+LINPHONE_PUBLIC LinphonePublishState linphone_event_get_publish_state(const LinphoneEvent *lev);
+
+/**
+ * Get subscription direction.
+ * If the object wasn't created by a subscription mechanism, #LinphoneSubscriptionInvalidDir is returned.
+**/
+LINPHONE_PUBLIC LinphoneSubscriptionDir linphone_event_get_subscription_dir(LinphoneEvent *lev);
+
+/**
+ * Set a user (application) pointer.
+**/
+LINPHONE_PUBLIC void linphone_event_set_user_data(LinphoneEvent *ev, void *up);
+
+/**
+ * Retrieve user pointer.
+**/
+LINPHONE_PUBLIC void *linphone_event_get_user_data(const LinphoneEvent *ev);
+
+/**
+ * Add a custom header to an outgoing susbscription or publish.
+ * @param ev the #LinphoneEvent
+ * @param name header's name
+ * @param value the header's value.
+**/
+LINPHONE_PUBLIC void linphone_event_add_custom_header(LinphoneEvent *ev, const char *name, const char *value);
+
+/**
+ * Obtain the value of a given header for an incoming subscription.
+ * @param ev the #LinphoneEvent
+ * @param name header's name
+ * @return the header's value or NULL if such header doesn't exist.
+**/
+LINPHONE_PUBLIC const char *linphone_event_get_custom_header(LinphoneEvent *ev, const char *name);
+
+/**
+ * Terminate an incoming or outgoing subscription that was previously acccepted, or a previous publication.
+ * The #LinphoneEvent shall not be used anymore after this operation, unless the application explicitely took a reference on the object with
+ * linphone_event_ref().
+**/
+LINPHONE_PUBLIC void linphone_event_terminate(LinphoneEvent *lev);
+
+/**
+ * Increase reference count of LinphoneEvent.
+ * By default #LinphoneEvents created by the core are owned by the core only.
+ * An application that wishes to retain a reference to it must call linphone_event_ref().
+ * When this reference is no longer needed, linphone_event_unref() must be called.
+ *
+**/
+LINPHONE_PUBLIC LinphoneEvent *linphone_event_ref(LinphoneEvent *lev);
+
+/**
+ * Decrease reference count.
+ * @see linphone_event_ref()
+**/
+LINPHONE_PUBLIC void linphone_event_unref(LinphoneEvent *lev);
+
+/**
+ * Get the name of the event as specified in the event package RFC.
+**/
+LINPHONE_PUBLIC const char *linphone_event_get_name(const LinphoneEvent *lev);
+
+/**
+ * Get the "from" address of the subscription.
+**/
+LINPHONE_PUBLIC const LinphoneAddress *linphone_event_get_from(const LinphoneEvent *lev);
+
+/**
+ * Get the resource address of the subscription or publish.
+**/
+LINPHONE_PUBLIC const LinphoneAddress *linphone_event_get_resource(const LinphoneEvent *lev);
+
+/**
+ * Get the "contact" address of the subscription.
+ * @param[in] lev #LinphoneEvent object
+ * @return The "contact" address of the subscription
+ */
+LINPHONE_PUBLIC const LinphoneAddress *linphone_event_get_remote_contact (const LinphoneEvent *lev);
+
+/**
+ * Returns back pointer to the #LinphoneCore that created this #LinphoneEvent
+**/
+LINPHONE_PUBLIC LinphoneCore *linphone_event_get_core(const LinphoneEvent *lev);
+
+/**
+ * Get the LinphoneEventCbs object associated with a LinphoneEvent.
+ * @param[in] ev LinphoneEvent object
+ * @return The LinphoneEventCbs object associated with the LinphoneEvent.
+ * @deprecated use add_callbacks / remove_callbacks instead
+**/
+LINPHONE_PUBLIC LinphoneEventCbs *linphone_event_get_callbacks(const LinphoneEvent *ev);
+
+/**
+ * Adds a LinphoneEventCbs object to be associated with a LinphoneEvent.
+ * @param[in] ev LinphoneEvent object
+ * @param[in] cbs The LinphoneEventCbs object to add
+**/
+LINPHONE_PUBLIC void linphone_event_add_callbacks(LinphoneEvent *ev, LinphoneEventCbs *cbs);
+
+/**
+ * Removes a LinphoneEventCbs object associated with a LinphoneEvent.
+ * @param[in] ev LinphoneEvent object
+ * @param[in] cbs The LinphoneEventCbs object to remove
+**/
+LINPHONE_PUBLIC void linphone_event_remove_callbacks(LinphoneEvent *ev, LinphoneEventCbs *cbs);
+
+/**
+ * Get the current LinphoneEventCbs object associated with a LinphoneEvent.
+ * @param[in] ev LinphoneEvent object
+ * @return The current LinphoneEventCbs object associated with the LinphoneEvent.
+**/
+LINPHONE_PUBLIC LinphoneEventCbs *linphone_event_get_current_callbacks(const LinphoneEvent *ev);
+
+/**
+ * Acquire a reference to a LinphoneEventCbs object.
+ * @param[in] cbs LinphoneEventCbs object.
+ * @return The same LinphoneEventCbs object.
+**/
+LINPHONE_PUBLIC LinphoneEventCbs *linphone_event_cbs_ref(LinphoneEventCbs *cbs);
+
+/**
+ * Release a reference to a LinphoneEventCbs object.
+ * @param[in] cbs LinphoneEventCbs object.
+**/
+LINPHONE_PUBLIC void linphone_event_cbs_unref(LinphoneEventCbs *cbs);
+
+/**
+ * Retrieve the user pointer associated with a LinphoneEventCbs object.
+ * @param[in] cbs LinphoneEventCbs object.
+ * @return The user pointer associated with the LinphoneEventCbs object.
+**/
+LINPHONE_PUBLIC void *linphone_event_cbs_get_user_data(const LinphoneEventCbs *cbs);
+
+/**
+ * Assign a user pointer to a LinphoneEventCbs object.
+ * @param[in] cbs LinphoneEventCbs object.
+ * @param[in] ud The user pointer to associate with the LinphoneEventCbs object.
+**/
+LINPHONE_PUBLIC void linphone_event_cbs_set_user_data(LinphoneEventCbs *cbs, void *ud);
+
+/**
+ * Get the notify response callback.
+ * @param[in] cbs LinphoneEventCbs object.
+ * @return The current notify response callback.
+**/
+LINPHONE_PUBLIC LinphoneEventCbsNotifyResponseCb linphone_event_cbs_get_notify_response(const LinphoneEventCbs *cbs);
+
+/**
+ * Set the notify response callback.
+ * @param[in] cbs LinphoneEventCbs object.
+ * @param[in] cb The notify response callback to be used.
+**/
+LINPHONE_PUBLIC void linphone_event_cbs_set_notify_response(LinphoneEventCbs *cbs, LinphoneEventCbsNotifyResponseCb cb);
+
+/**
+ * @}
+**/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* LINPHONE_EVENT_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/factory.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/factory.h"
new file mode 100644
index 0000000..64c9c26
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/factory.h"
@@ -0,0 +1,592 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_FACTORY_H
+#define LINPHONE_FACTORY_H
+
+#include "linphone/types.h"
+#include "logging.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup initializing
+ * @{
+ */
+
+/**
+ * Create the #LinphoneFactory if that has not been done and return
+ * a pointer on it.
+ * @return A pointer on the #LinphoneFactory
+ */
+LINPHONE_PUBLIC LinphoneFactory *linphone_factory_get(void);
+
+/**
+ * Clean the factory. This function is generally useless as the factory is unique per process, however
+ * calling this function at the end avoid getting reports from belle-sip leak detector about memory leaked in linphone_factory_get().
+ */
+LINPHONE_PUBLIC void linphone_factory_clean(void);
+
+/**
+ * Instanciate a #LinphoneCore object.
+ *
+ * The #LinphoneCore object is the primary handle for doing all phone actions.
+ * It should be unique within your application.
+ * @param factory The #LinphoneFactory singleton.
+ * @param cbs a #LinphoneCoreCbs object holding your application callbacks. A reference
+ * will be taken on it until the destruciton of the core or the unregistration
+ * with linphone_core_remove_cbs().
+ * @param config_path a path to a config file. If it does not exists it will be created.
+ *        The config file is used to store all settings, call logs, friends, proxies... so that all these settings
+ *	       become persistent over the life of the LinphoneCore object.
+ *	       It is allowed to set a NULL config file. In that case LinphoneCore will not store any settings.
+ * @param factory_config_path a path to a read-only config file that can be used to
+ *        to store hard-coded preference such as proxy settings or internal preferences.
+ *        The settings in this factory file always override the one in the normal config file.
+ *        It is OPTIONAL, use NULL if unneeded.
+ * @see linphone_core_new_with_config
+ * @deprecated 2018-01-10: Use linphone_factory_create_core_3() instead
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneCore *linphone_factory_create_core(
+	const LinphoneFactory *factory,
+	LinphoneCoreCbs *cbs,
+	const char *config_path,
+	const char *factory_config_path
+);
+
+/**
+ * Instanciate a #LinphoneCore object.
+ *
+ * The #LinphoneCore object is the primary handle for doing all phone actions.
+ * It should be unique within your application.
+ * @param factory The #LinphoneFactory singleton.
+ * @param cbs a #LinphoneCoreCbs object holding your application callbacks. A reference
+ * will be taken on it until the destruciton of the core or the unregistration
+ * with linphone_core_remove_cbs().
+ * @param config_path a path to a config file. If it does not exists it will be created.
+ *        The config file is used to store all settings, call logs, friends, proxies... so that all these settings
+ *	       become persistent over the life of the LinphoneCore object.
+ *	       It is allowed to set a NULL config file. In that case LinphoneCore will not store any settings.
+ * @param factory_config_path a path to a read-only config file that can be used to
+ *        to store hard-coded preference such as proxy settings or internal preferences.
+ *        The settings in this factory file always override the one in the normal config file.
+ *        It is OPTIONAL, use NULL if unneeded.
+ * @param user_data an application pointer associated with the returned core.
+ * @param system_context a pointer to a system object required by the core to operate. Currently it is required to pass an android Context on android, pass NULL on other platforms.
+ * @see linphone_core_new_with_config
+ * @deprecated 2018-01-10: Use linphone_factory_create_core_3() instead
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneCore *linphone_factory_create_core_2 (
+	const LinphoneFactory *factory,
+	LinphoneCoreCbs *cbs,
+	const char *config_path,
+	const char *factory_config_path,
+	void *user_data,
+	void *system_context
+);
+
+/**
+ * Instantiate a #LinphoneCore object.
+ *
+ * The #LinphoneCore object is the primary handle for doing all phone actions. It should be unique within your
+ * application.
+ * The #LinphoneCore object is not started automatically, you need to call linphone_core_start() to that effect.
+ * The returned #LinphoneCore will be in #LinphoneGlobalState Ready.
+ * Core ressources can be released using linphone_core_stop() which is strongly encouraged on garbage collected languages.
+ * @param[in] factory The #LinphoneFactory singleton.
+ * @param[in] config_path A path to a config file. If it does not exists it will be created. The config file is used to
+ * store all settings, proxies... so that all these settings become persistent over the life of the #LinphoneCore object.
+ * It is allowed to set a NULL config file. In that case #LinphoneCore will not store any settings.
+ * @param[in] factory_config_path A path to a read-only config file that can be used to store hard-coded preferences
+ * such as proxy settings or internal preferences. The settings in this factory file always override the ones in the
+ * normal config file. It is optional, use NULL if unneeded.
+ * @param[in] system_context A pointer to a system object required by the core to operate. Currently it is required to
+ * pass an android Context on android, pass NULL on other platforms.
+ * @see linphone_core_new_with_config_3
+ */
+LINPHONE_PUBLIC LinphoneCore *linphone_factory_create_core_3 (
+	const LinphoneFactory *factory,
+	const char *config_path,
+	const char *factory_config_path,
+	void *system_context
+);
+
+/**
+ * Instantiates a #LinphoneCore object with a given LpConfig.
+ *
+ * @param factory The #LinphoneFactory singleton.
+ * The #LinphoneCore object is the primary handle for doing all phone actions.
+ * It should be unique within your application.
+ * @param cbs a #LinphoneCoreCbs object holding your application callbacks. A reference
+ * will be taken on it until the destruciton of the core or the unregistration
+ * with linphone_core_remove_cbs().
+ * @param config a pointer to an LpConfig object holding the configuration of the #LinphoneCore to be instantiated.
+ * @see linphone_core_new
+ * @deprecated 2018-01-10: Use linphone_factory_create_core_with_config_3() instead
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneCore *linphone_factory_create_core_with_config (
+	const LinphoneFactory *factory,
+	LinphoneCoreCbs *cbs,
+	LinphoneConfig *config
+);
+
+/**
+ * Instantiates a #LinphoneCore object with a given LpConfig.
+ *
+ * @param factory The #LinphoneFactory singleton.
+ * The #LinphoneCore object is the primary handle for doing all phone actions.
+ * It should be unique within your application.
+ * @param cbs a #LinphoneCoreCbs object holding your application callbacks. A reference
+ * will be taken on it until the destruciton of the core or the unregistration
+ * with linphone_core_remove_cbs().
+ * @param config a pointer to an LpConfig object holding the configuration of the #LinphoneCore to be instantiated.
+ * @param user_data an application pointer associated with the returned core.
+ * @param system_context a pointer to a system object required by the core to operate. Currently it is required to pass an android Context on android, pass NULL on other platforms.
+ * @see linphone_core_new
+ * @deprecated 2018-01-10: Use linphone_factory_create_core_with_config_3() instead
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneCore *linphone_factory_create_core_with_config_2 (
+	const LinphoneFactory *factory,
+	LinphoneCoreCbs *cbs,
+	LinphoneConfig *config,
+	void *user_data,
+	void *system_context
+);
+
+/**
+ * Instantiate a #LinphoneCore object with a given LinphoneConfig.
+ *
+ * The #LinphoneCore object is the primary handle for doing all phone actions. It should be unique within your
+ * application.
+ * The #LinphoneCore object is not started automatically, you need to call linphone_core_start() to that effect.
+ * The returned #LinphoneCore will be in #LinphoneGlobalState Ready.
+ * Core ressources can be released using linphone_core_stop() which is strongly encouraged on garbage collected languages.
+ * @param[in] factory The #LinphoneFactory singleton.
+ * @param[in] config A #LinphoneConfig object holding the configuration for the #LinphoneCore to be instantiated.
+ * @param[in] system_context A pointer to a system object required by the core to operate. Currently it is required to
+ * pass an android Context on android, pass NULL on other platforms.
+ * @see linphone_factory_create_core_3
+ */
+LINPHONE_PUBLIC LinphoneCore *linphone_factory_create_core_with_config_3 (
+	const LinphoneFactory *factory,
+	LinphoneConfig *config,
+	void *system_context
+);
+
+/**
+ * Instanciate a #LinphoneCoreCbs object.
+ * @return a new #LinphoneCoreCbs.
+ */
+LINPHONE_PUBLIC LinphoneCoreCbs *linphone_factory_create_core_cbs(const LinphoneFactory *factory);
+
+/**
+ * Parse a string holding a SIP URI and create the according #LinphoneAddress object.
+ * @param factory The #LinphoneFactory singleton.
+ * @param addr A string holding the SIP URI to parse.
+ * @return A new #LinphoneAddress.
+ */
+LINPHONE_PUBLIC LinphoneAddress *linphone_factory_create_address(const LinphoneFactory *factory, const char *addr);
+
+/**
+ * Create a #LinphoneParticipantDeviceIdentity object.
+ * @param factory The #LinphoneFactory singleton.
+ * @param address #LinphoneAddress object.
+ * @param name the name given to the device.
+ * @return A new #LinphoneParticipantDeviceIdentity.
+ */
+LINPHONE_PUBLIC LinphoneParticipantDeviceIdentity *linphone_factory_create_participant_device_identity(
+	const LinphoneFactory *factory,
+	const LinphoneAddress *address,
+	const char *name
+);
+
+/**
+ * Creates a #LinphoneAuthInfo object.
+ * The object can be created empty, that is with all arguments set to NULL.
+ * Username, userid, password, realm and domain can be set later using specific methods.
+ * At the end, username and passwd (or ha1) are required.
+ * @param factory The #LinphoneFactory singleton.
+ * @param username The username that needs to be authenticated
+ * @param userid The userid used for authenticating (use NULL if you don't know what it is)
+ * @param passwd The password in clear text
+ * @param ha1 The ha1-encrypted password if password is not given in clear text.
+ * @param realm The authentication domain (which can be larger than the sip domain. Unfortunately many SIP servers don't use this parameter.
+ * @param domain The SIP domain for which this authentication information is valid, if it has to be restricted for a single SIP domain.
+ * @return A #LinphoneAuthInfo object. linphone_auth_info_destroy() must be used to destroy it when no longer needed. The #LinphoneCore makes a copy of #LinphoneAuthInfo
+ * passed through linphone_core_add_auth_info().
+ */
+LINPHONE_PUBLIC LinphoneAuthInfo *linphone_factory_create_auth_info(const LinphoneFactory *factory, const char *username, const char *userid, const char *passwd, const char *ha1, const char *realm, const char *domain);
+
+/**
+ * Creates a #LinphoneAuthInfo object.
+ * The object can be created empty, that is with all arguments set to NULL.
+ * Username, userid, password, realm and domain can be set later using specific methods.
+ * At the end, username and passwd (or ha1) are required.
+ * @param factory The #LinphoneFactory singleton.
+ * @param username The username that needs to be authenticated
+ * @param userid The userid used for authenticating (use NULL if you don't know what it is)
+ * @param passwd The password in clear text
+ * @param ha1 The ha1-encrypted password if password is not given in clear text.
+ * @param realm The authentication domain (which can be larger than the sip domain. Unfortunately many SIP servers don't use this parameter.
+ * @param domain The SIP domain for which this authentication information is valid, if it has to be restricted for a single SIP domain.
+ * @param algorithm The algorithm for encrypting password.
+ * @return A #LinphoneAuthInfo object. linphone_auth_info_destroy() must be used to destroy it when no longer needed. The #LinphoneCore makes a copy of #LinphoneAuthInfo
+ * passed through linphone_core_add_auth_info().
+ */
+LINPHONE_PUBLIC LinphoneAuthInfo *linphone_factory_create_auth_info_2(const LinphoneFactory *factory, const char *username, const char *userid, const char *passwd, const char *ha1, const char *realm, const char *domain, const char *algorithm);
+
+/**
+ * Create a #LinphoneCallCbs object that holds callbacks for events happening on a call.
+ * @param[in] factory #LinphoneFactory singletion object
+ * @return A new #LinphoneCallCbs object
+ */
+LINPHONE_PUBLIC LinphoneCallCbs * linphone_factory_create_call_cbs(const LinphoneFactory *factory);
+
+/**
+ * Create a LinphoneChatRoomCbs object that holds callbacks for events happening on a chat room.
+ * @param[in] factory LinphoneFactory singletion object
+ * @return A new LinphoneChatRoomCbs object
+ */
+LINPHONE_PUBLIC LinphoneChatRoomCbs * linphone_factory_create_chat_room_cbs(const LinphoneFactory *factory);
+
+/**
+ * Create a LinphoneChatMessageCbs object that holds callbacks for events happening on a chat message.
+ * @param[in] factory LinphoneFactory singletion object
+ * @return A new LinphoneChatMessageCbs object
+ */
+LINPHONE_PUBLIC LinphoneChatMessageCbs * linphone_factory_create_chat_message_cbs(const LinphoneFactory *factory);
+
+/**
+ * Create an empty #LinphoneVcard.
+ * @return a new #LinphoneVcard.
+ * @ingroup initializing
+ */
+LINPHONE_PUBLIC LinphoneVcard *linphone_factory_create_vcard(LinphoneFactory *factory);
+
+/**
+ * Create a #LinphoneVideoDefinition from a given width and height
+ * @param[in] factory #LinphoneFactory singleton object
+ * @param[in] width The width of the created video definition
+ * @param[in] height The height of the created video definition
+ * @return A new #LinphoneVideoDefinition object
+ */
+LINPHONE_PUBLIC LinphoneVideoDefinition * linphone_factory_create_video_definition(const LinphoneFactory *factory, unsigned int width, unsigned int height);
+
+/**
+ * Create a #LinphoneVideoDefinition from a given standard definition name
+ * @param[in] factory #LinphoneFactory singleton object
+ * @param[in] name The standard definition name of the video definition to create
+ * @return A new #LinphoneVideoDefinition object
+ */
+LINPHONE_PUBLIC LinphoneVideoDefinition * linphone_factory_create_video_definition_from_name(const LinphoneFactory *factory, const char *name);
+
+/**
+ * Get the list of standard video definitions supported by Linphone.
+ * @param[in] factory #LinphoneFactory singleton object
+ * @return \bctbx_list{LinphoneVideoDefinition}
+ */
+LINPHONE_PUBLIC const bctbx_list_t * linphone_factory_get_supported_video_definitions(const LinphoneFactory *factory);
+
+/**
+ * Get the top directory where the resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @return The path to the top directory where the resources are located
+ */
+LINPHONE_PUBLIC const char * linphone_factory_get_top_resources_dir(const LinphoneFactory *factory);
+
+/**
+ * Set the top directory where the resources are located.
+ * If you only define this top directory, the other resources directory will automatically be derived form this one.
+ * @param[in] factory #LinphoneFactory object
+ * @param[in] path The path to the top directory where the resources are located
+ */
+LINPHONE_PUBLIC void linphone_factory_set_top_resources_dir(LinphoneFactory *factory, const char *path);
+
+/**
+ * Get the directory where the data resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @return The path to the directory where the data resources are located
+ */
+LINPHONE_PUBLIC const char * linphone_factory_get_data_resources_dir(LinphoneFactory *factory);
+
+/**
+ * Set the directory where the data resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @param[in] path The path where the data resources are located
+ */
+LINPHONE_PUBLIC void linphone_factory_set_data_resources_dir(LinphoneFactory *factory, const char *path);
+
+/**
+ * Get the directory where the sound resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @return The path to the directory where the sound resources are located
+ */
+LINPHONE_PUBLIC const char * linphone_factory_get_sound_resources_dir(LinphoneFactory *factory);
+
+/**
+ * Set the directory where the sound resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @param[in] path The path where the sound resources are located
+ */
+LINPHONE_PUBLIC void linphone_factory_set_sound_resources_dir(LinphoneFactory *factory, const char *path);
+
+/**
+ * Get the directory where the ring resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @return The path to the directory where the ring resources are located
+ */
+LINPHONE_PUBLIC const char * linphone_factory_get_ring_resources_dir(LinphoneFactory *factory);
+
+/**
+ * Set the directory where the ring resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @param[in] path The path where the ring resources are located
+ */
+LINPHONE_PUBLIC void linphone_factory_set_ring_resources_dir(LinphoneFactory *factory, const char *path);
+
+/**
+ * Get the directory where the image resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @return The path to the directory where the image resources are located
+ */
+LINPHONE_PUBLIC const char * linphone_factory_get_image_resources_dir(LinphoneFactory *factory);
+
+/**
+ * Set the directory where the image resources are located.
+ * @param[in] factory #LinphoneFactory object
+ * @param[in] path The path where the image resources are located
+ */
+LINPHONE_PUBLIC void linphone_factory_set_image_resources_dir(LinphoneFactory *factory, const char *path);
+
+/**
+ * Get the directory where the mediastreamer2 plugins are located.
+ * @param[in] factory #LinphoneFactory object
+ * @return The path to the directory where the mediastreamer2 plugins are located, or NULL if it has not been set
+ */
+LINPHONE_PUBLIC const char * linphone_factory_get_msplugins_dir(LinphoneFactory *factory);
+
+/**
+ * Set the directory where the mediastreamer2 plugins are located.
+ * @param[in] factory #LinphoneFactory object
+ * @param[in] path The path to the directory where the mediastreamer2 plugins are located
+ */
+LINPHONE_PUBLIC void linphone_factory_set_msplugins_dir(LinphoneFactory *factory, const char *path);
+
+/**
+ * Creates an object LinphoneErrorInfo.
+ * @param[in] factory #LinphoneFactory object
+ * @return  #LinphoneErrorInfo object.
+ */
+LINPHONE_PUBLIC  LinphoneErrorInfo *linphone_factory_create_error_info(LinphoneFactory *factory);
+
+/**
+ * Creates an object LinphoneRange.
+ * @param[in] factory #LinphoneFactory object
+ * @return  #LinphoneRange object.
+ */
+LINPHONE_PUBLIC LinphoneRange *linphone_factory_create_range(LinphoneFactory *factory);
+
+/**
+ * Creates an object LinphoneTransports.
+ * @param[in] factory #LinphoneFactory object
+ * @return  #LinphoneTransports object.
+ */
+LINPHONE_PUBLIC LinphoneTransports *linphone_factory_create_transports(LinphoneFactory *factory);
+
+/**
+ * Creates an object LinphoneVideoActivationPolicy.
+ * @param[in] factory #LinphoneFactory object
+ * @return  #LinphoneVideoActivationPolicy object.
+ */
+LINPHONE_PUBLIC LinphoneVideoActivationPolicy *linphone_factory_create_video_activation_policy(LinphoneFactory *factory);
+
+/**
+ * Returns a bctbx_list_t of all DialPlans
+ * @param[in] factory the #LinphoneFactory object
+ * @return \bctbx_list{LinphoneDialPlan} a list of DialPlan
+ */
+LINPHONE_PUBLIC const bctbx_list_t * linphone_factory_get_dial_plans(const LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphoneContent
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphoneContent
+ */
+LINPHONE_PUBLIC LinphoneContent *linphone_factory_create_content(LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphoneBuffer
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphoneBuffer
+ */
+LINPHONE_PUBLIC LinphoneBuffer *linphone_factory_create_buffer(LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphoneBuffer
+ * @param[in] factory the #LinphoneFactory
+ * @param[in] data the data to set in the buffer
+ * @param[in] size the size of the data
+ * @return a #LinphoneBuffer
+ */
+LINPHONE_PUBLIC LinphoneBuffer *linphone_factory_create_buffer_from_data(LinphoneFactory *factory, const uint8_t *data, size_t size);
+
+/**
+ * Creates an object #LinphoneBuffer
+ * @param[in] factory the #LinphoneFactory
+ * @param[in] data the data to set in the buffer
+ * @return a #LinphoneBuffer
+ */
+LINPHONE_PUBLIC LinphoneBuffer *linphone_factory_create_buffer_from_string(LinphoneFactory *factory, const char *data);
+
+/**
+ * Creates an object #LinphoneConfig
+ * @param[in] factory the #LinphoneFactory
+ * @param[in] path the path of the config
+ * @return a #LinphoneConfig
+ */
+LINPHONE_PUBLIC LinphoneConfig *linphone_factory_create_config(LinphoneFactory *factory, const char *path);
+
+/**
+ * Creates an object #LinphoneConfig
+ * @param[in] factory the #LinphoneFactory
+ * @param[in] path the path of the config
+ * @param[in] path the path of the factory
+ * @return a #LinphoneConfig
+ */
+LINPHONE_PUBLIC LinphoneConfig *linphone_factory_create_config_with_factory(LinphoneFactory *factory, const char *path, const char *factory_path);
+
+/**
+ * Creates an object #LinphoneConfig
+ * @param[in] factory the #LinphoneFactory
+ * @param[in] data the config data
+ * @return a #LinphoneConfig
+ */
+LINPHONE_PUBLIC LinphoneConfig *linphone_factory_create_config_from_string(LinphoneFactory *factory, const char *data);
+
+/**
+ * Gets the user data in the #LinphoneFactory object
+ * @param[in] factory the #LinphoneFactory
+ * @return the user data
+*/
+LINPHONE_PUBLIC void *linphone_factory_get_user_data(const LinphoneFactory *factory);
+
+/**
+ * Sets the user data in the #LinphoneFactory object
+ * @param[in] factory the #LinphoneFactory object
+ * @param[in] data the user data
+*/
+LINPHONE_PUBLIC void linphone_factory_set_user_data(LinphoneFactory *factory, void *data);
+
+/**
+ * Sets the log collection path
+ * @param[in] factory the #LinphoneFactory
+ * @param[in] path the path of the logs
+ */
+LINPHONE_PUBLIC void linphone_factory_set_log_collection_path(LinphoneFactory *factory, const char *path);
+
+/**
+ * Enables or disables log collection
+ * @param[in] factory the #LinphoneFactory
+ * @param[in] state the policy for log collection
+ */
+LINPHONE_PUBLIC void linphone_factory_enable_log_collection(LinphoneFactory *factory, LinphoneLogCollectionState state);
+
+/**
+ * Creates an object #LinphoneTunnelConfig
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphoneTunnelConfig
+ */
+LINPHONE_PUBLIC LinphoneTunnelConfig *linphone_factory_create_tunnel_config(LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphoneLoggingServiceCbs
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphoneLoggingServiceCbs
+ */
+LINPHONE_PUBLIC LinphoneLoggingServiceCbs *linphone_factory_create_logging_service_cbs(LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphonePlayerCbs
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphonePlayerCbs
+ */
+LINPHONE_PUBLIC LinphonePlayerCbs *linphone_factory_create_player_cbs(LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphoneEventCbs
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphoneEventCbs
+ */
+LINPHONE_PUBLIC LinphoneEventCbs *linphone_factory_create_event_cbs(LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphoneFriendListCbs
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphoneFriendListCbs
+ */
+LINPHONE_PUBLIC LinphoneFriendListCbs *linphone_factory_create_friend_list_cbs(LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphoneAccountCreatorCbs
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphoneAccountCreatorCbs
+ */
+LINPHONE_PUBLIC LinphoneAccountCreatorCbs *linphone_factory_create_account_creator_cbs(LinphoneFactory *factory);
+
+/**
+ * Creates an object #LinphoneXmlRpcRequestCbs
+ * @param[in] factory the #LinphoneFactory
+ * @return a #LinphoneXmlRpcRequestCbs
+ */
+LINPHONE_PUBLIC LinphoneXmlRpcRequestCbs *linphone_factory_create_xml_rpc_request_cbs(LinphoneFactory *factory);
+
+/**
+ * Indicates if the given LinphoneChatRoomBackend is available
+ * @param[in] factory the #LinphoneFactory
+ * @param[in] chatroom_backend the #LinphoneChatRoomBackend
+ * @return TRUE if the chatroom backend is available, FALSE otherwise
+ */
+LINPHONE_PUBLIC bool_t linphone_factory_is_chatroom_backend_available(LinphoneFactory *factory, LinphoneChatRoomBackend chatroom_backend);
+
+/**
+ * Indicates if the storage in database is available
+ * @param[in] factory the #LinphoneFactory
+ * @return TRUE if the database storage is available, FALSE otherwise
+ */
+LINPHONE_PUBLIC bool_t linphone_factory_is_database_storage_available(LinphoneFactory *factory);
+
+/**
+ * Indicates if IMDN are available
+ * @param[in] factory the #LinphoneFactory
+ * @return TRUE if IDMN are available
+ */
+LINPHONE_PUBLIC bool_t linphone_factory_is_imdn_available(LinphoneFactory *factory);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif // LINPHONE_FACTORY_H
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/friend.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/friend.h"
new file mode 100644
index 0000000..70c3675
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/friend.h"
@@ -0,0 +1,390 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_FRIEND_H_
+#define LINPHONE_FRIEND_H_
+
+#include "linphone/types.h"
+#include "linphone/sipsetup.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup buddy_list
+ * @{
+ */
+
+/**
+ * Contructor
+ * @return a new empty #LinphoneFriend
+ * @deprecated use #linphone_core_create_friend instead
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneFriend * linphone_friend_new(void);
+
+/**
+ * Contructor same as linphone_friend_new() + linphone_friend_set_address()
+ * @param addr a buddy address, must be a sip uri like sip:joe@sip.linphone.org
+ * @return a new #LinphoneFriend with \link linphone_friend_get_address() address initialized \endlink
+ * @deprecated use #linphone_core_create_friend_with_address instead
+ * @donotwrap
+ */
+LINPHONE_PUBLIC	LINPHONE_DEPRECATED LinphoneFriend *linphone_friend_new_with_address(const char *addr);
+
+/**
+ * Contructor same as linphone_friend_new() + linphone_friend_set_address()
+ * @deprecated Use #linphone_friend_new_with_address instead
+ */
+#define linphone_friend_new_with_addr linphone_friend_new_with_address
+
+/**
+ * Destroy a LinphoneFriend.
+ * @param lf #LinphoneFriend object
+ * @deprecated Use linphone_friend_unref() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_friend_destroy(LinphoneFriend *lf);
+
+/**
+ * Set #LinphoneAddress for this friend
+ * @param fr #LinphoneFriend object
+ * @param address #LinphoneAddress
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_friend_set_address(LinphoneFriend *fr, const LinphoneAddress* address);
+
+/**
+ * Set #LinphoneAddress for this friend
+ * @deprecated Use #linphone_friend_set_address instead
+ */
+#define linphone_friend_set_addr linphone_friend_set_address
+
+/**
+ * Get address of this friend.
+ * @note the #LinphoneAddress object returned is hold by the LinphoneFriend, however calling several time this function may return different objects.
+ * @param lf #LinphoneFriend object
+ * @return #LinphoneAddress
+ */
+LINPHONE_PUBLIC const LinphoneAddress * linphone_friend_get_address(const LinphoneFriend *lf);
+
+/**
+ * Adds an address in this friend
+ * @param lf #LinphoneFriend object
+ * @param addr #LinphoneAddress object
+ */
+LINPHONE_PUBLIC void linphone_friend_add_address(LinphoneFriend *lf, const LinphoneAddress *addr);
+
+/**
+ * Returns a list of #LinphoneAddress for this friend
+ * @param lf #LinphoneFriend object
+ * @return \bctbx_list{LinphoneAddress}
+ */
+LINPHONE_PUBLIC const bctbx_list_t* linphone_friend_get_addresses(const LinphoneFriend *lf);
+
+/**
+ * Removes an address in this friend
+ * @param lf #LinphoneFriend object
+ * @param addr #LinphoneAddress object
+ */
+LINPHONE_PUBLIC void linphone_friend_remove_address(LinphoneFriend *lf, const LinphoneAddress *addr);
+
+/**
+ * Adds a phone number in this friend
+ * @param lf #LinphoneFriend object
+ * @param phone number to add
+ */
+LINPHONE_PUBLIC void linphone_friend_add_phone_number(LinphoneFriend *lf, const char *phone);
+
+/**
+ * Returns a list of phone numbers for this friend
+ * @param lf #LinphoneFriend object
+ * @return \bctbx_list{const char *}
+ */
+LINPHONE_PUBLIC bctbx_list_t* linphone_friend_get_phone_numbers(const LinphoneFriend *lf);
+
+/**
+ * Removes a phone number in this friend
+ * @param lf #LinphoneFriend object
+ * @param phone number to remove
+ */
+LINPHONE_PUBLIC void linphone_friend_remove_phone_number(LinphoneFriend *lf, const char *phone);
+
+/**
+ * Set the display name for this friend
+ * @param lf #LinphoneFriend object
+ * @param name
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_friend_set_name(LinphoneFriend *lf, const char *name);
+
+/**
+ * Get the display name for this friend
+ * @param lf #LinphoneFriend object
+ * @return The display name of this friend
+ */
+LINPHONE_PUBLIC const char * linphone_friend_get_name(const LinphoneFriend *lf);
+
+/**
+ * get subscription flag value
+ * @param lf #LinphoneFriend object
+ * @return returns true is subscription is activated for this friend
+ *
+ */
+LINPHONE_PUBLIC bool_t linphone_friend_subscribes_enabled(const LinphoneFriend *lf);
+#define linphone_friend_get_send_subscribe linphone_friend_subscribes_enabled
+
+/**
+ * Configure #LinphoneFriend to subscribe to presence information
+ * @param fr #LinphoneFriend object
+ * @param val if TRUE this friend will receive subscription message
+ */
+
+LINPHONE_PUBLIC	LinphoneStatus linphone_friend_enable_subscribes(LinphoneFriend *fr, bool_t val);
+#define linphone_friend_send_subscribe linphone_friend_enable_subscribes
+
+/**
+ * Configure incoming subscription policy for this friend.
+ * @param fr #LinphoneFriend object
+ * @param pol #LinphoneSubscribePolicy policy to apply.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_friend_set_inc_subscribe_policy(LinphoneFriend *fr, LinphoneSubscribePolicy pol);
+
+/**
+ * get current subscription policy for this #LinphoneFriend
+ * @param lf #LinphoneFriend object
+ * @return #LinphoneSubscribePolicy
+ *
+ */
+LINPHONE_PUBLIC LinphoneSubscribePolicy linphone_friend_get_inc_subscribe_policy(const LinphoneFriend *lf);
+
+/**
+ * Starts editing a friend configuration.
+ *
+ * Because friend configuration must be consistent, applications MUST
+ * call linphone_friend_edit() before doing any attempts to modify
+ * friend configuration (such as \link linphone_friend_set_address() address \endlink  or \link linphone_friend_set_inc_subscribe_policy() subscription policy\endlink  and so on).
+ * Once the modifications are done, then the application must call
+ * linphone_friend_done() to commit the changes.
+**/
+LINPHONE_PUBLIC	void linphone_friend_edit(LinphoneFriend *fr);
+
+/**
+ * Commits modification made to the friend configuration.
+ * @param fr #LinphoneFriend object
+**/
+LINPHONE_PUBLIC	void linphone_friend_done(LinphoneFriend *fr);
+
+/**
+ * Get the status of a friend
+ * @param[in] lf A #LinphoneFriend object
+ * @return #LinphoneOnlineStatus
+ * @deprecated Use linphone_friend_get_presence_model() instead
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneOnlineStatus linphone_friend_get_status(const LinphoneFriend *lf);
+
+/**
+ * Get subscription state of a friend
+ * @param[in] lf A #LinphoneFriend object
+ * @return #LinphoneSubscriptionState
+ */
+
+LINPHONE_PUBLIC LinphoneSubscriptionState linphone_friend_get_subscription_state(const LinphoneFriend *lf);
+
+/**
+ * Get the presence model of a friend
+ * @param[in] lf A #LinphoneFriend object
+ * @return A #LinphonePresenceModel object, or NULL if the friend do not have presence information (in which case he is considered offline)
+ */
+LINPHONE_PUBLIC const LinphonePresenceModel * linphone_friend_get_presence_model(const LinphoneFriend *lf);
+
+/**
+ * Get the consolidated presence of a friend.
+ * @param[in] lf #LinphoneFriend object
+ * @return The consolidated presence of the friend
+ */
+LINPHONE_PUBLIC LinphoneConsolidatedPresence linphone_friend_get_consolidated_presence(const LinphoneFriend *lf);
+
+/**
+ * Get the presence model for a specific SIP URI or phone number of a friend
+ * @param[in] lf A #LinphoneFriend object
+ * @param[in] uri_or_tel The SIP URI or phone number for which to get the presence model
+ * @return A #LinphonePresenceModel object, or NULL if the friend do not have presence information for this SIP URI or phone number
+ */
+LINPHONE_PUBLIC const LinphonePresenceModel * linphone_friend_get_presence_model_for_uri_or_tel(const LinphoneFriend *lf, const char *uri_or_tel);
+
+/**
+ * Set the presence model of a friend
+ * @param[in] lf A #LinphoneFriend object
+ * @param[in] presence The #LinphonePresenceModel object to set for the friend
+ */
+LINPHONE_PUBLIC void linphone_friend_set_presence_model(LinphoneFriend *lf, LinphonePresenceModel *presence);
+
+/**
+ * Set the presence model for a specific SIP URI or phone number of a friend
+ * @param[in] lf A #LinphoneFriend object
+ * @param[in] uri_or_tel The SIP URI or phone number for which to set the presence model
+ * @param[in] presence The #LinphonePresenceModel object to set
+ */
+LINPHONE_PUBLIC void linphone_friend_set_presence_model_for_uri_or_tel(LinphoneFriend *lf, const char *uri_or_tel, LinphonePresenceModel *presence);
+
+/**
+ * Tells whether we already received presence information for a friend.
+ * @param[in] lf A #LinphoneFriend object
+ * @return TRUE if presence information has been received for the friend, FALSE otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_friend_is_presence_received(const LinphoneFriend *lf);
+
+/**
+ * Store user pointer to friend object.
+**/
+LINPHONE_PUBLIC void linphone_friend_set_user_data(LinphoneFriend *lf, void *data);
+
+/**
+ * Retrieve user data associated with friend.
+**/
+LINPHONE_PUBLIC void* linphone_friend_get_user_data(const LinphoneFriend *lf);
+
+LINPHONE_PUBLIC BuddyInfo * linphone_friend_get_info(const LinphoneFriend *lf);
+
+/**
+ * Set the reference key of a friend.
+ * @param[in] lf #LinphoneFriend object.
+ * @param[in] key The reference key to use for the friend.
+**/
+LINPHONE_PUBLIC void linphone_friend_set_ref_key(LinphoneFriend *lf, const char *key);
+
+/**
+ * Get the reference key of a friend.
+ * @param[in] lf #LinphoneFriend object.
+ * @return The reference key of the friend.
+**/
+LINPHONE_PUBLIC const char *linphone_friend_get_ref_key(const LinphoneFriend *lf);
+
+/**
+ * Check that the given friend is in a friend list.
+ * @param[in] lf #LinphoneFriend object.
+ * @return TRUE if the friend is in a friend list, FALSE otherwise.
+**/
+LINPHONE_PUBLIC bool_t linphone_friend_in_list(const LinphoneFriend *lf);
+
+/**
+ * Acquire a reference to the linphone friend.
+ * @param[in] lf #LinphoneFriend object
+ * @return The same #LinphoneFriend object
+**/
+LINPHONE_PUBLIC LinphoneFriend * linphone_friend_ref(LinphoneFriend *lf);
+
+/**
+ * Release a reference to the linphone friend.
+ * @param[in] lf #LinphoneFriend object
+**/
+LINPHONE_PUBLIC void linphone_friend_unref(LinphoneFriend *lf);
+
+/**
+ * Returns the #LinphoneCore object managing this friend, if any.
+ * @param[in] fr #LinphoneFriend object
+ */
+LINPHONE_PUBLIC LinphoneCore *linphone_friend_get_core(const LinphoneFriend *fr);
+
+/**
+ * Returns the vCard object associated to this friend, if any
+ * @param[in] fr #LinphoneFriend object
+ */
+LINPHONE_PUBLIC LinphoneVcard* linphone_friend_get_vcard(const LinphoneFriend *fr);
+
+/**
+ * Binds a vCard object to a friend
+ * @param[in] fr #LinphoneFriend object
+ * @param[in] vcard The vCard object to bind
+ */
+LINPHONE_PUBLIC void linphone_friend_set_vcard(LinphoneFriend *fr, LinphoneVcard *vcard);
+
+/**
+ * Creates a vCard object associated to this friend if there isn't one yet and if the full name is available, either by the parameter or the one in the friend's SIP URI
+ * @param[in] fr #LinphoneFriend object
+ * @param[in] name The full name of the friend or NULL to use the one from the friend's SIP URI
+ * @return true if the vCard has been created, false if it wasn't possible (for exemple if name and the friend's SIP URI are null or if the friend's SIP URI doesn't have a display name), or if there is already one vcard
+ */
+LINPHONE_PUBLIC bool_t linphone_friend_create_vcard(LinphoneFriend *fr, const char *name);
+
+/**
+ * Contructor same as linphone_friend_new() + linphone_friend_set_address()
+ * @param vcard a vCard object
+ * @return a new #LinphoneFriend with \link linphone_friend_get_vcard() vCard initialized \endlink
+ */
+LINPHONE_PUBLIC	LinphoneFriend *linphone_friend_new_from_vcard(LinphoneVcard *vcard);
+
+/**
+ * Saves a friend either in database if configured, otherwise in linphonerc
+ * @param fr the linphone friend to save
+ * @param lc the linphone core
+ */
+LINPHONE_PUBLIC void linphone_friend_save(LinphoneFriend *fr, LinphoneCore *lc);
+
+/**
+ * Returns the capabilities associated to this friend
+ * @param[in] lf #LinphoneFriend object
+ * @return an int representing the capabilities of the friend
+ */
+LINPHONE_PUBLIC int linphone_friend_get_capabilities(const LinphoneFriend *lf);
+
+/**
+ * Returns whether or not a friend has a capbility
+ * @param[in] lf #LinphoneFriend object
+ * @param[in] capability #LinphoneFriendCapability object
+ * @return whether or not a friend has a capbility
+ */
+LINPHONE_PUBLIC bool_t linphone_friend_has_capability(const LinphoneFriend *lf, const LinphoneFriendCapability capability);
+
+/**
+ * Returns whether or not a friend has a capbility with a given version.
+ * @param[in] lf #LinphoneFriend object
+ * @param[in] capability #LinphoneFriendCapability object
+ * @param[in] version the version to test
+ * @return whether or not a friend has a capbility with a given version or -1.0 if friend has not capability.
+ */
+LINPHONE_PUBLIC bool_t linphone_friend_has_capability_with_version(const LinphoneFriend *lf, const LinphoneFriendCapability capability, float version);
+
+/**
+ * Returns whether or not a friend has a capbility with a given version or more.
+ * @param[in] lf #LinphoneFriend object
+ * @param[in] capability #LinphoneFriendCapability object
+ * @param[in] version the version to test
+ * @return whether or not a friend has a capbility with a given version or more.
+ */
+LINPHONE_PUBLIC bool_t linphone_friend_has_capability_with_version_or_more(const LinphoneFriend *lf, const LinphoneFriendCapability capability, float version);
+
+/**
+ * Returns the version of a friend's capbility.
+ * @param[in] lf #LinphoneFriend object
+ * @param[in] capability #LinphoneFriendCapability object
+ * @return the version of a friend's capbility.
+ */
+LINPHONE_PUBLIC float linphone_friend_get_capability_version(const LinphoneFriend *lf, const LinphoneFriendCapability capability);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_FRIEND_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/friendlist.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/friendlist.h"
new file mode 100644
index 0000000..0930e0f
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/friendlist.h"
@@ -0,0 +1,417 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef LINPHONE_FRIENDLIST_H_
+#define LINPHONE_FRIENDLIST_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup buddy_list
+ * @{
+ */
+
+/**
+ * Acquire a reference to the friend list.
+ * @param[in] list #LinphoneFriendList object.
+ * @return The same #LinphoneFriendList object.
+**/
+LINPHONE_PUBLIC LinphoneFriendList * linphone_friend_list_ref(LinphoneFriendList *list);
+
+/**
+ * Release reference to the friend list.
+ * @param[in] list #LinphoneFriendList object.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_unref(LinphoneFriendList *list);
+
+/**
+ * Retrieve the user pointer associated with the friend list.
+ * @param[in] list #LinphoneFriendList object.
+ * @return The user pointer associated with the friend list.
+**/
+LINPHONE_PUBLIC void * linphone_friend_list_get_user_data(const LinphoneFriendList *list);
+
+/**
+ * Assign a user pointer to the friend list.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] ud The user pointer to associate with the friend list.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_set_user_data(LinphoneFriendList *list, void *ud);
+
+/**
+ * Get the display name of the friend list.
+ * @param[in] list #LinphoneFriendList object.
+ * @return The display name of the friend list.
+**/
+LINPHONE_PUBLIC const char * linphone_friend_list_get_display_name(const LinphoneFriendList *list);
+
+/**
+ * Set the display name of the friend list.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] display_name The new display name of the friend list.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_set_display_name(LinphoneFriendList *list, const char *display_name);
+
+/**
+ * Get the RLS (Resource List Server) URI associated with the friend list to subscribe to these friends presence.
+ * @param[in] list #LinphoneFriendList object.
+ * @return The RLS URI associated with the friend list.
+**/
+LINPHONE_PUBLIC const char * linphone_friend_list_get_rls_uri(const LinphoneFriendList *list);
+
+/**
+ * Set the RLS (Resource List Server) URI associated with the friend list to subscribe to these friends presence.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] rls_uri The RLS URI to associate with the friend list.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_set_rls_uri(LinphoneFriendList *list, const char *rls_uri);
+
+/**
+ * Get the RLS (Resource List Server) URI associated with the friend list to subscribe to these friends presence.
+ * @param[in] list #LinphoneFriendList object.
+ * @return The RLS URI associated with the friend list.
+**/
+LINPHONE_PUBLIC const LinphoneAddress * linphone_friend_list_get_rls_address(const LinphoneFriendList *list);
+
+/**
+ * Set the RLS (Resource List Server) URI associated with the friend list to subscribe to these friends presence.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] rls_addr The RLS URI to associate with the friend list.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_set_rls_address(LinphoneFriendList *list, const LinphoneAddress *rls_addr);
+
+/**
+ * Add a friend to a friend list. If or when a remote CardDAV server will be attached to the list, the friend will be sent to the server.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] lf #LinphoneFriend object to add to the friend list.
+ * @return #LinphoneFriendListOK if successfully added, #LinphoneFriendListInvalidFriend if the friend is not valid.
+**/
+LINPHONE_PUBLIC LinphoneFriendListStatus linphone_friend_list_add_friend(LinphoneFriendList *list, LinphoneFriend *lf);
+
+/**
+ * Add a friend to a friend list. The friend will never be sent to a remote CardDAV server.
+ * Warning! #LinphoneFriends added this way will be removed on the next synchronization, and the callback contact_deleted will be called.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] lf #LinphoneFriend object to add to the friend list.
+ * @return #LinphoneFriendListOK if successfully added, #LinphoneFriendListInvalidFriend if the friend is not valid.
+**/
+LINPHONE_PUBLIC LinphoneFriendListStatus linphone_friend_list_add_local_friend(LinphoneFriendList *list, LinphoneFriend *lf);
+
+/**
+ * Remove a friend from a friend list.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] lf #LinphoneFriend object to remove from the friend list.
+ * @return #LinphoneFriendListOK if removed successfully, #LinphoneFriendListNonExistentFriend if the friend is not in the list.
+**/
+LINPHONE_PUBLIC LinphoneFriendListStatus linphone_friend_list_remove_friend(LinphoneFriendList *list, LinphoneFriend *lf);
+
+/**
+ * Retrieves the list of #LinphoneFriend from this LinphoneFriendList.
+ * @param[in] list #LinphoneFriendList object
+ * @return \bctbx_list{LinphoneFriend} a list of #LinphoneFriend
+ */
+LINPHONE_PUBLIC const bctbx_list_t * linphone_friend_list_get_friends(const LinphoneFriendList *list);
+
+/**
+ * Find a friend in the friend list using a LinphoneAddress.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] address #LinphoneAddress object of the friend we want to search for.
+ * @return A #LinphoneFriend if found, NULL otherwise.
+**/
+LINPHONE_PUBLIC LinphoneFriend * linphone_friend_list_find_friend_by_address(const LinphoneFriendList *list, const LinphoneAddress *address);
+
+/**
+ * Find all friends in the friend list using a LinphoneAddress.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] address #LinphoneAddress object of the friends we want to search for.
+ * @return \bctbx_list{LinphoneFriend} as a list of #LinphoneFriend if found, NULL otherwise.
+**/
+LINPHONE_PUBLIC bctbx_list_t * linphone_friend_list_find_friends_by_address(const LinphoneFriendList *list, const LinphoneAddress *address);
+
+/**
+ * Find a friend in the friend list using an URI string.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] uri A string containing the URI of the friend we want to search for.
+ * @return A #LinphoneFriend if found, NULL otherwise.
+**/
+LINPHONE_PUBLIC LinphoneFriend * linphone_friend_list_find_friend_by_uri(const LinphoneFriendList *list, const char *uri);
+
+/**
+ * Find all friends in the friend list using an URI string.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] uri A string containing the URI of the friends we want to search for.
+ * @return \bctbx_list{LinphoneFriend} as a list of #LinphoneFriend if found, NULL otherwise.
+**/
+LINPHONE_PUBLIC bctbx_list_t * linphone_friend_list_find_friends_by_uri(const LinphoneFriendList *list, const char *uri);
+
+/**
+ * Find a friend in the friend list using a ref key.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] ref_key The ref key string of the friend we want to search for.
+ * @return A #LinphoneFriend if found, NULL otherwise.
+**/
+LINPHONE_PUBLIC LinphoneFriend * linphone_friend_list_find_friend_by_ref_key(const LinphoneFriendList *list, const char *ref_key);
+
+/**
+ * Update presence subscriptions for the entire list. Calling this function is necessary when list subscriptions are enabled,
+ * ie when a RLS presence server is used.
+ * @param[in] list the friend list
+**/
+LINPHONE_PUBLIC void linphone_friend_list_update_subscriptions(LinphoneFriendList *list);
+
+/**
+ * Notify our presence to all the friends in the friend list that have subscribed to our presence directly (not using a RLS).
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] presence #LinphonePresenceModel object.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_notify_presence(LinphoneFriendList *list, LinphonePresenceModel *presence);
+
+/**
+ * Get the URI associated with the friend list.
+ * @param[in] list #LinphoneFriendList object.
+ * @return The URI associated with the friend list.
+**/
+LINPHONE_PUBLIC const char * linphone_friend_list_get_uri(const LinphoneFriendList *list);
+
+/**
+ * Set the URI associated with the friend list.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] uri The URI to associate with the friend list.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_set_uri(LinphoneFriendList *list, const char *uri);
+
+/**
+ * Get wheter the subscription of the friend list is bodyless or not.
+ * @param[in] list #LinphoneFriendList object.
+ * @return Wheter the subscription of the friend list is bodyless or not.
+**/
+LINPHONE_PUBLIC bool_t linphone_friend_list_is_subscription_bodyless(LinphoneFriendList *list);
+
+/**
+ * Set wheter the subscription of the friend list is bodyless or not.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] a boolean telling if the subscription of the friend list is bodyless or not.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_set_subscription_bodyless(LinphoneFriendList *list, bool_t bodyless);
+
+/**
+ * Sets the revision from the last synchronization.
+ * @param[in] list #LinphoneFriendList object.
+ * @param[in] rev The revision
+ */
+LINPHONE_PUBLIC void linphone_friend_list_update_revision(LinphoneFriendList *list, int rev);
+
+/**
+ * Get the #LinphoneFriendListCbs object associated with a LinphoneFriendList.
+ * @param[in] friend_list #LinphoneFriendList object
+ * @return The #LinphoneFriendListCbs object associated with the LinphoneFriendList.
+ * @deprecated use add_callbacks / remove_callbacks instead
+**/
+LINPHONE_PUBLIC LinphoneFriendListCbs * linphone_friend_list_get_callbacks(const LinphoneFriendList *friend_list);
+
+/**
+ * Adds the #LinphoneFriendListCbs object associated with a LinphoneFriendList.
+ * @param[in] friend_list #LinphoneFriendList object
+ * @param[in] cbs The current #LinphoneFriendListCbs object to be added to the LinphoneFriendList.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_add_callbacks(LinphoneFriendList *friend_list, LinphoneFriendListCbs *cbs);
+
+/**
+ * Removes the #LinphoneFriendListCbs object associated with a LinphoneFriendList.
+ * @param[in] friend_list #LinphoneFriendList object
+ * @param[in] cbs The current #LinphoneFriendListCbs object to be remove from the LinphoneFriendList.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_remove_callbacks(LinphoneFriendList *friend_list, LinphoneFriendListCbs *cbs);
+
+/**
+ * Get the current #LinphoneFriendListCbs object associated with a LinphoneFriendList.
+ * @param[in] friend_list #LinphoneFriendList object
+ * @return The current #LinphoneFriendListCbs object associated with the LinphoneFriendList.
+**/
+LINPHONE_PUBLIC LinphoneFriendListCbs *linphone_friend_list_get_current_callbacks(const LinphoneFriendList *friend_list);
+
+/**
+ * Acquire a reference to a #LinphoneFriendListCbs object.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @return The same #LinphoneFriendListCbs object.
+**/
+LINPHONE_PUBLIC LinphoneFriendListCbs * linphone_friend_list_cbs_ref(LinphoneFriendListCbs *cbs);
+
+/**
+ * Release a reference to a #LinphoneFriendListCbs object.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_cbs_unref(LinphoneFriendListCbs *cbs);
+
+/**
+ * Retrieve the user pointer associated with a #LinphoneFriendListCbs object.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @return The user pointer associated with the #LinphoneFriendListCbs object.
+**/
+LINPHONE_PUBLIC void *linphone_friend_list_cbs_get_user_data(const LinphoneFriendListCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneFriendListCbs object.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @param[in] ud The user pointer to associate with the #LinphoneFriendListCbs object.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_cbs_set_user_data(LinphoneFriendListCbs *cbs, void *ud);
+
+/**
+ * Get the contact created callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @return The current contact created callback.
+**/
+LINPHONE_PUBLIC LinphoneFriendListCbsContactCreatedCb linphone_friend_list_cbs_get_contact_created(const LinphoneFriendListCbs *cbs);
+
+/**
+ * Set the contact created callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @param[in] cb The contact created to be used.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_cbs_set_contact_created(LinphoneFriendListCbs *cbs, LinphoneFriendListCbsContactCreatedCb cb);
+
+/**
+ * Get the contact deleted callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @return The current contact deleted callback.
+**/
+LINPHONE_PUBLIC LinphoneFriendListCbsContactDeletedCb linphone_friend_list_cbs_get_contact_deleted(const LinphoneFriendListCbs *cbs);
+
+/**
+ * Set the contact deleted callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @param[in] cb The contact deleted to be used.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_cbs_set_contact_deleted(LinphoneFriendListCbs *cbs, LinphoneFriendListCbsContactDeletedCb cb);
+
+/**
+ * Get the contact updated callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @return The current contact updated callback.
+**/
+LINPHONE_PUBLIC LinphoneFriendListCbsContactUpdatedCb linphone_friend_list_cbs_get_contact_updated(const LinphoneFriendListCbs *cbs);
+
+/**
+ * Set the contact updated callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @param[in] cb The contact updated to be used.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_cbs_set_contact_updated(LinphoneFriendListCbs *cbs, LinphoneFriendListCbsContactUpdatedCb cb);
+
+/**
+ * Get the sync status changed callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @return The current sync status changedcallback.
+**/
+LINPHONE_PUBLIC LinphoneFriendListCbsSyncStateChangedCb linphone_friend_list_cbs_get_sync_status_changed(const LinphoneFriendListCbs *cbs);
+
+/**
+ * Set the contact updated callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @param[in] cb The sync status changed to be used.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_cbs_set_sync_status_changed(LinphoneFriendListCbs *cbs, LinphoneFriendListCbsSyncStateChangedCb cb);
+
+/**
+ * Get the presence received callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @return The current presence received callback.
+**/
+LINPHONE_PUBLIC LinphoneFriendListCbsPresenceReceivedCb linphone_friend_list_cbs_get_presence_received(const LinphoneFriendListCbs *cbs);
+
+/**
+ * Set the presence received callback.
+ * @param[in] cbs #LinphoneFriendListCbs object.
+ * @param[in] cb The presence received callback to be used.
+**/
+LINPHONE_PUBLIC void linphone_friend_list_cbs_set_presence_received(LinphoneFriendListCbs *cbs, LinphoneFriendListCbsPresenceReceivedCb cb);
+
+/**
+ * Starts a CardDAV synchronization using value set using linphone_friend_list_set_uri.
+ * @param[in] list #LinphoneFriendList object.
+ */
+LINPHONE_PUBLIC void linphone_friend_list_synchronize_friends_from_server(LinphoneFriendList *list);
+
+/**
+ * Goes through all the #LinphoneFriend that are dirty and does a CardDAV PUT to update the server.
+ * @param[in] list #LinphoneFriendList object.
+ */
+LINPHONE_PUBLIC void linphone_friend_list_update_dirty_friends(LinphoneFriendList *list);
+
+/**
+ * Returns the #LinphoneCore object attached to this LinphoneFriendList.
+ * @param[in] list #LinphoneFriendList object.
+ * @return a #LinphoneCore object
+ */
+LINPHONE_PUBLIC LinphoneCore* linphone_friend_list_get_core(const LinphoneFriendList *list);
+
+/**
+ * Creates and adds #LinphoneFriend objects to #LinphoneFriendList from a file that contains the vCard(s) to parse
+ * @param[in] list the #LinphoneFriendList object
+ * @param[in] vcard_file the path to a file that contains the vCard(s) to parse
+ * @return the amount of linphone friends created
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_friend_list_import_friends_from_vcard4_file(LinphoneFriendList *list, const char *vcard_file);
+
+/**
+ * Creates and adds #LinphoneFriend objects to #LinphoneFriendList from a buffer that contains the vCard(s) to parse
+ * @param[in] list the #LinphoneFriendList object
+ * @param[in] vcard_buffer the buffer that contains the vCard(s) to parse
+ * @return the amount of linphone friends created
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_friend_list_import_friends_from_vcard4_buffer(LinphoneFriendList *list, const char *vcard_buffer);
+
+/**
+ * Creates and export #LinphoneFriend objects from #LinphoneFriendList to a file using vCard 4 format
+ * @param[in] list the #LinphoneFriendList object
+ * @param[in] vcard_file the path to a file that will contain the vCards
+ */
+LINPHONE_PUBLIC void linphone_friend_list_export_friends_as_vcard4_file(LinphoneFriendList *list, const char *vcard_file);
+
+/**
+ * Enable subscription to NOTIFYes of all friends list
+ * @param[in] list the #LinphoneFriendList object
+ * @param[in] enabled should subscription be enabled or not
+ */
+LINPHONE_PUBLIC void linphone_friend_list_enable_subscriptions(LinphoneFriendList *list, bool_t enabled);
+
+/**
+ * Gets whether subscription to NOTIFYes of all friends list are enabled or not
+ * @param[in] list the #LinphoneFriendList object
+ * @return Whether subscriptions are enabled or not
+ */
+LINPHONE_PUBLIC bool_t linphone_friend_list_subscriptions_enabled(LinphoneFriendList *list);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_FRIENDLIST_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/headers.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/headers.h"
new file mode 100644
index 0000000..7037215
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/headers.h"
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_HEADERS_H_
+#define LINPHONE_HEADERS_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Increments ref count.
+**/
+LINPHONE_PUBLIC LinphoneHeaders * linphone_headers_ref(LinphoneHeaders *obj);
+
+/**
+ * Decrements ref count.
+**/
+LINPHONE_PUBLIC void linphone_headers_unref(LinphoneHeaders *obj);
+
+/**
+ * Search for a given header name and return its value.
+ * @param obj the #LinphoneHeaders object
+ * @param name the header's name
+ * @return the header's value or NULL if not found.
+**/
+
+LINPHONE_PUBLIC const char* linphone_headers_get_value(LinphoneHeaders *obj, const char *header_name);
+
+/**
+ * Add given header name and corresponding value.
+ * @param obj the #LinphoneHeaders object
+ * @param name the header's name
+ * @param the header's value
+**/
+LINPHONE_PUBLIC void linphone_headers_add(LinphoneHeaders *obj, const char *name, const char *value);
+
+/**
+ * Add given header name and corresponding value.
+ * @param obj the #LinphoneHeaders object
+ * @param name the header's name
+ * @param the header's value
+**/
+LINPHONE_PUBLIC void linphone_headers_remove(LinphoneHeaders *obj, const char *name);
+
+
+/**
+ * @}
+**/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/im_encryption_engine.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/im_encryption_engine.h"
new file mode 100644
index 0000000..bf30ff1
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/im_encryption_engine.h"
@@ -0,0 +1,231 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_IM_ENCRYPTION_ENGINE_H
+#define LINPHONE_IM_ENCRYPTION_ENGINE_H
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Acquire a reference to the LinphoneImEncryptionEngineCbs.
+ * @param[in] cbs #LinphoneImEncryptionEngineCbs object.
+ * @return The same #LinphoneImEncryptionEngineCbs object.
+ * @donotwrap
+**/
+LinphoneImEncryptionEngineCbs * linphone_im_encryption_engine_cbs_ref(LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Release reference to the LinphoneImEncryptionEngineCbs.
+ * @param[in] cbs #LinphoneImEncryptionEngineCbs object.
+ * @donotwrap
+**/
+void linphone_im_encryption_engine_cbs_unref(LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Gets the user data in the #LinphoneImEncryptionEngineCbs object
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs
+ * @return the user data
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void *linphone_im_encryption_engine_cbs_get_user_data(const LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Sets the user data in the #LinphoneImEncryptionEngineCbs object
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @param[in] data the user data
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_user_data(LinphoneImEncryptionEngineCbs *cbs, void *data);
+
+/**
+ * Acquire a reference to the LinphoneImEncryptionEngine.
+ * @param[in] imee #LinphoneImEncryptionEngine object.
+ * @return The same #LinphoneImEncryptionEngine object.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LinphoneImEncryptionEngine * linphone_im_encryption_engine_ref(LinphoneImEncryptionEngine *imee);
+
+/**
+ * Release reference to the LinphoneImEncryptionEngine.
+ * @param[in] imee #LinphoneImEncryptionEngine object.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_unref(LinphoneImEncryptionEngine *imee);
+
+/**
+ * Gets the user data in the #LinphoneImEncryptionEngine object
+ * @param[in] imee the #LinphoneImEncryptionEngine
+ * @return the user data
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void *linphone_im_encryption_engine_get_user_data(const LinphoneImEncryptionEngine *imee);
+
+/**
+ * Sets the user data in the #LinphoneImEncryptionEngine object
+ * @param[in] imee the #LinphoneImEncryptionEngine object
+ * @param[in] data the user data
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_set_user_data(LinphoneImEncryptionEngine *imee, void *data);
+
+/**
+ * Gets the #LinphoneCore object that created the IM encryption engine
+ * @param[in] imee #LinphoneImEncryptionEngine object
+ * @return The #LinphoneCore object that created the IM encryption engine
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LinphoneCore * linphone_im_encryption_engine_get_core(LinphoneImEncryptionEngine *imee);
+
+/**
+ * Gets the #LinphoneImEncryptionEngineCbs object that holds the callbacks
+ * @param[in] imee the #LinphoneImEncryptionEngine object
+ * @return the #LinphoneImEncryptionEngineCbs object
+ * @donotwrap
+*/
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbs* linphone_im_encryption_engine_get_callbacks(const LinphoneImEncryptionEngine *imee);
+
+/**
+ * Gets the callback that will decrypt the chat messages upon reception
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @return the callback
+ * @donotwrap
+*/
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsIncomingMessageCb linphone_im_encryption_engine_cbs_get_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Sets the callback that will decrypt the chat messages upon reception
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_incoming_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsIncomingMessageCb cb);
+
+/**
+ * Gets the callback that will encrypt the chat messages before sending them
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @return the callback
+ * @donotwrap
+*/
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsOutgoingMessageCb linphone_im_encryption_engine_cbs_get_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Sets the callback that will encrypt the chat messages before sending them
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_outgoing_message(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsOutgoingMessageCb cb);
+
+/**
+ * Gets the callback that will decrypt the files while downloading them
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @return the callback
+ * @donotwrap
+*/
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsDownloadingFileCb linphone_im_encryption_engine_cbs_get_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Sets the callback that will decrypt the files while downloading them
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_downloading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsDownloadingFileCb cb);
+
+/**
+ * Gets the callback that will will encrypt the files while uploading them
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @return the callback
+ * @donotwrap
+*/
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsUploadingFileCb linphone_im_encryption_engine_cbs_get_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Sets the callback that will encrypt the files while uploading them
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_process_uploading_file(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsUploadingFileCb cb);
+
+/**
+ * Gets the callback telling whether or not to encrypt the files
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @return the callback
+ * @donotwrap
+*/
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb linphone_im_encryption_engine_cbs_get_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Sets the callback telling whether or not to encrypt the files
+ * @param[in] cbs the LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_is_encryption_enabled_for_file_transfer(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsIsEncryptionEnabledForFileTransferCb cb);
+
+/**
+ * Gets the callback that will generate the key to encrypt the file before uploading it
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @return the callback
+ * @donotwrap
+*/
+LINPHONE_PUBLIC LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb linphone_im_encryption_engine_cbs_get_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs);
+
+/**
+ * Sets the callback that will generate the key to encrypt the file before uploading it
+ * @param[in] cbs the #LinphoneImEncryptionEngineCbs object
+ * @param[in] cb the callback to call
+ * @donotwrap
+*/
+LINPHONE_PUBLIC void linphone_im_encryption_engine_cbs_set_generate_file_transfer_key(LinphoneImEncryptionEngineCbs *cbs, LinphoneImEncryptionEngineCbsGenerateFileTransferKeyCb cb);
+
+/** Set a chat message text to be sent by #linphone_chat_room_send_message
+ * @param[in] msg #LinphoneChatMessage
+ * @param[in] text Const char *
+ * @returns 0 if succeed.
+ * @donotwrap
+*/
+LINPHONE_PUBLIC int linphone_chat_message_set_text(LinphoneChatMessage *msg, const char* text);
+
+/**
+ * Create the IM encryption engine
+ * @return The created the IM encryption engine
+ * @donotwrap
+*/
+LINPHONE_PUBLIC LinphoneImEncryptionEngine *linphone_im_encryption_engine_new(void);
+	
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_IM_ENCRYPTION_ENGINE_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/im_notif_policy.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/im_notif_policy.h"
new file mode 100644
index 0000000..c9f8fc8
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/im_notif_policy.h"
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_IM_NOTIF_POLICY_H_
+#define LINPHONE_IM_NOTIF_POLICY_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup chatroom
+ * @{
+ */
+
+/**
+ * Acquire a reference to the #LinphoneImNotifPolicy object.
+ * @param[in] policy #LinphoneImNotifPolicy object.
+ * @return The same #LinphoneImNotifPolicy object.
+**/
+LINPHONE_PUBLIC LinphoneImNotifPolicy * linphone_im_notif_policy_ref(LinphoneImNotifPolicy *policy);
+
+/**
+ * Release reference to the #LinphoneImNotifPolicy object.
+ * @param[in] policy #LinphoneImNotifPolicy object.
+**/
+LINPHONE_PUBLIC void linphone_im_notif_policy_unref(LinphoneImNotifPolicy *policy);
+
+/**
+ * Retrieve the user pointer associated with the #LinphoneImNotifPolicy object.
+ * @param[in] policy #LinphoneImNotifPolicy object.
+ * @return The user pointer associated with the #LinphoneImNotifPolicy object.
+**/
+LINPHONE_PUBLIC void *linphone_im_notif_policy_get_user_data(const LinphoneImNotifPolicy *policy);
+
+/**
+ * Assign a user pointer to the #LinphoneImNotifPolicy object.
+ * @param[in] policy #LinphoneImNotifPolicy object.
+ * @param[in] ud The user pointer to associate with the #LinphoneImNotifPolicy object.
+**/
+LINPHONE_PUBLIC void linphone_im_notif_policy_set_user_data(LinphoneImNotifPolicy *policy, void *ud);
+
+/**
+ * Clear an IM notif policy (deactivate all receiving and sending of notifications).
+ * @param[in] policy #LinphoneImNotifPolicy object.
+ */
+LINPHONE_PUBLIC void linphone_im_notif_policy_clear(LinphoneImNotifPolicy *policy);
+
+/**
+ * Enable all receiving and sending of notifications.
+ * @param[in] policy #LinphoneImNotifPolicy object.
+ */
+LINPHONE_PUBLIC void linphone_im_notif_policy_enable_all(LinphoneImNotifPolicy *policy);
+
+/**
+ * Tell whether is_composing notifications are being sent.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @return Boolean value telling whether is_composing notifications are being sent.
+ */
+LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_send_is_composing(const LinphoneImNotifPolicy *policy);
+
+/**
+ * Enable is_composing notifications sending.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @param[in] enable Boolean value telling whether to send is_composing notifications.
+ */
+LINPHONE_PUBLIC void linphone_im_notif_policy_set_send_is_composing(LinphoneImNotifPolicy *policy, bool_t enable);
+
+/**
+ * Tell whether is_composing notifications are being notified when received.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @return Boolean value telling whether is_composing notifications are being notified when received.
+ */
+LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_recv_is_composing(const LinphoneImNotifPolicy *policy);
+
+/**
+ * Enable is_composing notifications receiving.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @param[in] enable Boolean value telling whether to notify received is_composing notifications.
+ */
+LINPHONE_PUBLIC void linphone_im_notif_policy_set_recv_is_composing(LinphoneImNotifPolicy *policy, bool_t enable);
+
+/**
+ * Tell whether imdn delivered notifications are being sent.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @return Boolean value telling whether imdn delivered notifications are being sent.
+ */
+LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_send_imdn_delivered(const LinphoneImNotifPolicy *policy);
+
+/**
+ * Enable imdn delivered notifications sending.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @param[in] enable Boolean value telling whether to send imdn delivered notifications.
+ */
+LINPHONE_PUBLIC void linphone_im_notif_policy_set_send_imdn_delivered(LinphoneImNotifPolicy *policy, bool_t enable);
+
+/**
+ * Tell whether imdn delivered notifications are being notified when received.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @return Boolean value telling whether imdn delivered notifications are being notified when received.
+ */
+LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_recv_imdn_delivered(const LinphoneImNotifPolicy *policy);
+
+/**
+ * Enable imdn delivered notifications receiving.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @param[in] enable Boolean value telling whether to notify received imdn delivered notifications.
+ */
+LINPHONE_PUBLIC void linphone_im_notif_policy_set_recv_imdn_delivered(LinphoneImNotifPolicy *policy, bool_t enable);
+
+/**
+ * Tell whether imdn displayed notifications are being sent.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @return Boolean value telling whether imdn displayed notifications are being sent.
+ */
+LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_send_imdn_displayed(const LinphoneImNotifPolicy *policy);
+
+/**
+ * Enable imdn displayed notifications sending.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @param[in] enable Boolean value telling whether to send imdn displayed notifications.
+ */
+LINPHONE_PUBLIC void linphone_im_notif_policy_set_send_imdn_displayed(LinphoneImNotifPolicy *policy, bool_t enable);
+
+/**
+ * Tell whether imdn displayed notifications are being notified when received.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @return Boolean value telling whether imdn displayed notifications are being notified when received.
+ */
+LINPHONE_PUBLIC bool_t linphone_im_notif_policy_get_recv_imdn_displayed(const LinphoneImNotifPolicy *policy);
+
+/**
+ * Enable imdn displayed notifications receiving.
+ * @param[in] policy #LinphoneImNotifPolicy object
+ * @param[in] enable Boolean value telling whether to notify received imdn displayed notifications.
+ */
+LINPHONE_PUBLIC void linphone_im_notif_policy_set_recv_imdn_displayed(LinphoneImNotifPolicy *policy, bool_t enable);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_IM_NOTIF_POLICY_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/info_message.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/info_message.h"
new file mode 100644
index 0000000..ed081ee
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/info_message.h"
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_INFO_MESSAGE_H_
+#define LINPHONE_INFO_MESSAGE_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+
+/**
+ * Add a header to an info message to be sent.
+ * @param im the info message
+ * @param name the header'name
+ * @param value the header's value
+**/
+LINPHONE_PUBLIC void linphone_info_message_add_header(LinphoneInfoMessage *im, const char *name, const char *value);
+
+/**
+ * Obtain a header value from a received info message.
+ * @param im the info message
+ * @param name the header'name
+ * @return the corresponding header's value, or NULL if not exists.
+**/
+LINPHONE_PUBLIC const char *linphone_info_message_get_header(const LinphoneInfoMessage *im, const char *name);
+
+/**
+ * Assign a content to the info message.
+ * @param im the linphone info message
+ * @param content the content described as a #LinphoneContent structure.
+ * All fields of the #LinphoneContent are copied, thus the application can destroy/modify/recycloe the content object freely ater the function returns.
+**/
+LINPHONE_PUBLIC void linphone_info_message_set_content(LinphoneInfoMessage *im, const LinphoneContent *content);
+
+/**
+ * Returns the info message's content as a #LinphoneContent structure.
+**/
+LINPHONE_PUBLIC const LinphoneContent * linphone_info_message_get_content(const LinphoneInfoMessage *im);
+
+/**
+ * Take a reference on a #LinphoneInfoMessage.
+ */
+LINPHONE_PUBLIC LinphoneInfoMessage *linphone_info_message_ref(LinphoneInfoMessage *im);
+
+/**
+ * Release a reference on a #LinphoneInfoMessage.
+ */
+LINPHONE_PUBLIC void linphone_info_message_unref(LinphoneInfoMessage *im);
+
+/**
+ * Destroy a LinphoneInfoMessage.
+ * @deprecated Use linphone_info_message_unref() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_info_message_destroy(LinphoneInfoMessage *im);
+
+LINPHONE_PUBLIC LinphoneInfoMessage *linphone_info_message_copy(const LinphoneInfoMessage *orig);
+
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_INFO_MESSAGE_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/ldapprovider.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/ldapprovider.h"
new file mode 100644
index 0000000..332695f
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/ldapprovider.h"
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_LDAPPROVIDER_H_
+#define LINPHONE_LDAPPROVIDER_H_
+
+
+#include "linphone/contactprovider.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* LinphoneLDAPContactSearch */
+
+LinphoneLDAPContactSearch * linphone_ldap_contact_search_create(LinphoneLDAPContactProvider *ld, const char *predicate, ContactSearchCallback cb, void *cb_data);
+
+LINPHONE_PUBLIC unsigned int linphone_ldap_contact_search_result_count(LinphoneLDAPContactSearch *obj);
+
+LINPHONE_PUBLIC LinphoneLDAPContactSearch * linphone_ldap_contact_search_cast(void *obj);
+
+
+/* LinphoneLDAPContactProvider */
+
+LINPHONE_PUBLIC LinphoneLDAPContactProvider * linphone_ldap_contact_provider_create(LinphoneCore *lc, const LinphoneDictionary *config);
+
+LINPHONE_PUBLIC unsigned int linphone_ldap_contact_provider_get_max_result(const LinphoneLDAPContactProvider *obj);
+
+LINPHONE_PUBLIC LinphoneLDAPContactProvider * linphone_ldap_contact_provider_ref(void *obj);
+
+void linphone_ldap_contact_provider_unref(void *obj);
+
+LinphoneLDAPContactProvider * linphone_ldap_contact_provider_cast(void *obj);
+
+LINPHONE_PUBLIC int linphone_ldap_contact_provider_available(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* LINPHONE_LDAPPROVIDER_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphone_proxy_config.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphone_proxy_config.h"
new file mode 100644
index 0000000..2ca0ba2
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphone_proxy_config.h"
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_LINPHONE_PROXY_CONFIG_H
+#define LINPHONE_LINPHONE_PROXY_CONFIG_H
+
+#include <linphone/proxy_config.h>
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphone_tunnel.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphone_tunnel.h"
new file mode 100644
index 0000000..ee3c046
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphone_tunnel.h"
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef LINPHONE_LINPHONETUNNEL_H
+#define LINPHONE_LINPHONETUNNEL_H
+
+#include "linphone/tunnel.h"
+
+#endif /* LINPHONE_LINPHONETUNNEL_H */
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonecore.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonecore.h"
new file mode 100644
index 0000000..bae28f5
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonecore.h"
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_LINPHONECORE_H
+#define LINPHONE_LINPHONECORE_H
+
+#include <linphone/core.h>
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonecore_utils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonecore_utils.h"
new file mode 100644
index 0000000..1de1ff3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonecore_utils.h"
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_LINPHONECORE_UTILS_H
+#define LINPHONE_LINPHONECORE_UTILS_H
+
+#include "linphone/core_utils.h"
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonefriend.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonefriend.h"
new file mode 100644
index 0000000..43f560b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonefriend.h"
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_LINPHONEFRIEND_H_
+#define LINPHONE_LINPHONEFRIEND_H_
+
+#include <linphone/friend.h>
+
+#endif /* LINPHONE_LINPHONEFRIEND_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonepresence.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonepresence.h"
new file mode 100644
index 0000000..6153fa9
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/linphonepresence.h"
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_LINPHONEPRESENCE_H_
+#define LINPHONE_LINPHONEPRESENCE_H_
+
+#include <linphone/presence.h>
+
+#endif /* LINPHONE_LINPHONEPRESENCE_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/logging.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/logging.h"
new file mode 100644
index 0000000..4ec5fb0
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/logging.h"
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _LINPHONE_LOG_H_
+#define _LINPHONE_LOG_H_
+
+#include "types.h"
+#include "defs.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup logging
+ * @{
+ */
+
+/**
+ * @brief Singleton class giving access to logging features.
+ */
+typedef struct _LinphoneLoggingService LinphoneLoggingService;
+
+/**
+ * @brief Listener for #LinphoneLoggingService.
+ */
+typedef struct _LinphoneLoggingServiceCbs LinphoneLoggingServiceCbs;
+
+/**
+ * @brief Verbosity levels of log messages.
+ */
+typedef enum _LinphoneLogLevel {
+	LinphoneLogLevelDebug   = 1,    /**< @brief Level for debug messages. */
+	LinphoneLogLevelTrace   = 1<<1, /**< @brief Level for traces. */
+	LinphoneLogLevelMessage = 1<<2, /**< @brief Level for information messages. */
+	LinphoneLogLevelWarning = 1<<3, /**< @brief Level for warning messages. */
+	LinphoneLogLevelError   = 1<<4, /**< @brief Level for error messages. */
+	LinphoneLogLevelFatal   = 1<<5  /**< @brief Level for fatal error messages. */
+} LinphoneLogLevel;
+
+/**
+ * @brief Type of callbacks called each time liblinphone write a log message.
+ * 
+ * @param log_service A pointer on the logging service singleton.
+ * @param domain A string describing which sub-library of liblinphone the message is coming from.
+ * @param lev Verbosity level of the message.
+ * @param message Content of the message.
+ */
+typedef void (*LinphoneLoggingServiceCbsLogMessageWrittenCb)(LinphoneLoggingService *log_service, const char *domain, LinphoneLogLevel lev, const char *message);
+
+
+
+
+
+/**
+ * @brief Gets the singleton logging service object.
+ * 
+ * The singleton is automatically instantiated if it hasn't
+ * been done yet.
+ * 
+ * @return A pointer on the singleton.
+ */
+LINPHONE_PUBLIC LinphoneLoggingService *linphone_logging_service_get(void);
+
+/**
+ * @brief Increases the reference counter.
+ */
+LINPHONE_PUBLIC LinphoneLoggingService *linphone_logging_service_ref(LinphoneLoggingService *service);
+
+/**
+ * @brief Decreases the reference counter and destroy the object
+ * if the counter reaches 0.
+ */
+LINPHONE_PUBLIC void linphone_logging_service_unref(LinphoneLoggingService *service);
+
+/**
+ * @brief Gets the logging service listener.
+ * @deprecated Use add_callbacks / remove_callbacks instead
+ */
+LINPHONE_PUBLIC LinphoneLoggingServiceCbs *linphone_logging_service_get_callbacks(const LinphoneLoggingService *log_service);
+
+/**
+ * Adds a callback object to the list of listeners
+ * @param log_service the LinphoneLoggingService object
+ * @param cbs the LinphoneLoggingServiceCbs to add
+ */
+LINPHONE_PUBLIC void linphone_logging_service_add_callbacks(LinphoneLoggingService *log_service, LinphoneLoggingServiceCbs *cbs);
+
+/**
+ * Removes a callback object from the list of listeners
+ * @param log_service the LinphoneLoggingService object
+ * @param cbs the LinphoneLoggingServiceCbs to remove
+ */
+LINPHONE_PUBLIC void linphone_logging_service_remove_callbacks(LinphoneLoggingService *log_service, LinphoneLoggingServiceCbs *cbs);
+
+/**
+ * Returns the current callbacks being called while iterating on callbacks
+ * @param log_service the LinphoneLoggingService object
+ * @return A pointer to the current LinphoneLoggingServiceCbs object
+ */
+LINPHONE_PUBLIC LinphoneLoggingServiceCbs *linphone_logging_service_get_current_callbacks(const LinphoneLoggingService *log_service);
+
+/**
+ * @brief Set the verbosity of the log.
+ * 
+ * For instance, a level of #LinphoneLogLevelMessage will let pass fatal, error, warning and message-typed messages
+ * whereas trace and debug messages will be dumped out.
+ */
+LINPHONE_PUBLIC void linphone_logging_service_set_log_level(LinphoneLoggingService *log_service, LinphoneLogLevel level);
+
+/**
+ * @brief Sets the types of messages that will be authorized to be written in the log.
+ * @param log_service The logging service singleton.
+ * @param mask Example: #LinphoneLogLevelMessage|#LinphoneLogLevelError will ONLY let pass message-typed and error messages.
+ * @note Calling that function reset the log level that has been specified by #linphone_logging_service_set_log_level().
+ */
+LINPHONE_PUBLIC void linphone_logging_service_set_log_level_mask(LinphoneLoggingService *log_service, unsigned int mask);
+
+/**
+ * @brief Gets the log level mask.
+ */
+LINPHONE_PUBLIC unsigned int linphone_logging_service_get_log_level_mask(const LinphoneLoggingService *log_service);
+
+/**
+ * @brief Enables logging in a file.
+ * 
+ * That function enables an internal log handler that writes log messages in
+ * log-rotated files.
+ * 
+ * @param dir Directory where to create the distinct parts of the log.
+ * @param filename Name of the log file.
+ * @param max_size The maximal size of each part of the log. The log rotating is triggered
+ * each time the currently opened log part reach that limit.
+ */
+LINPHONE_PUBLIC void linphone_logging_service_set_log_file(const LinphoneLoggingService *service, const char *dir, const char *filename, size_t max_size);
+
+/**
+ * @brief Increases the reference counter.
+ */
+LINPHONE_PUBLIC LinphoneLoggingServiceCbs *linphone_logging_service_cbs_ref(LinphoneLoggingServiceCbs *cbs);
+
+/**
+ * @brief Decreases the reference counter.
+ * 
+ * The object is automatically destroyed once the counter reach 0.
+ */
+LINPHONE_PUBLIC void linphone_logging_service_cbs_unref(LinphoneLoggingServiceCbs *cbs);
+
+/**
+ * @brief Sets the callback to call each time liblinphone writes a log message.
+ */
+LINPHONE_PUBLIC void linphone_logging_service_cbs_set_log_message_written(LinphoneLoggingServiceCbs *cbs, LinphoneLoggingServiceCbsLogMessageWrittenCb cb);
+
+/**
+ * @brief Gets the value of the message event callback.
+ */
+LINPHONE_PUBLIC LinphoneLoggingServiceCbsLogMessageWrittenCb linphone_logging_service_cbs_get_log_message_written(const LinphoneLoggingServiceCbs *cbs);
+
+/**
+ * @brief Pass a pointer on a custom object.
+ * 
+ * That pointer can be get back by callbacks by using #linphone_logging_service_get_cbs() and #linphone_logging_service_cbs_get_user_data().
+ */
+LINPHONE_PUBLIC void linphone_logging_service_cbs_set_user_data(LinphoneLoggingServiceCbs *cbs, void *user_data);
+
+/**
+ * @brief Gets the user_data pointer back.
+ */
+LINPHONE_PUBLIC void *linphone_logging_service_cbs_get_user_data(const LinphoneLoggingServiceCbs *cbs);
+
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _LINPHONE_LOG_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/lpconfig.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/lpconfig.h"
new file mode 100644
index 0000000..b5abf62
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/lpconfig.h"
@@ -0,0 +1,462 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef LPCONFIG_H
+#define LPCONFIG_H
+
+#include "linphone/types.h"
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Safely downcast a belle_sip_object into #LinphoneConfig
+ */
+#define LINPHONE_CONFIG(obj) BELLE_SIP_CAST(obj, LinphoneConfig);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Instantiates a #LinphoneConfig object from a user config file.
+ * The caller of this constructor owns a reference. linphone_config_unref() must be called when this object is no longer needed.
+ * @ingroup misc
+ * @param filename the filename of the config file to read to fill the instantiated #LinphoneConfig
+ * @see linphone_config_new_with_factory
+ */
+LINPHONE_PUBLIC LinphoneConfig * linphone_config_new(const char *filename);
+
+/**
+ * Instantiates a #LinphoneConfig object from a user provided buffer.
+ * The caller of this constructor owns a reference. linphone_config_unref() must be called when this object is no longer needed.
+ * @ingroup misc
+ * @param buffer the buffer from which the #LinphoneConfig will be retrieved. We expect the buffer to be null-terminated.
+ * @see linphone_config_new_with_factory
+ * @see linphone_config_new
+ */
+LINPHONE_PUBLIC LinphoneConfig * linphone_config_new_from_buffer(const char *buffer);
+
+/**
+ * Instantiates a #LinphoneConfig object from a user config file and a factory config file.
+ * The caller of this constructor owns a reference. linphone_config_unref() must be called when this object is no longer needed.
+ * @ingroup misc
+ * @param config_filename the filename of the user config file to read to fill the instantiated #LinphoneConfig
+ * @param factory_config_filename the filename of the factory config file to read to fill the instantiated #LinphoneConfig
+ * @see linphone_config_new
+ *
+ * The user config file is read first to fill the #LinphoneConfig and then the factory config file is read.
+ * Therefore the configuration parameters defined in the user config file will be overwritten by the parameters
+ * defined in the factory config file.
+ */
+LINPHONE_PUBLIC LinphoneConfig * linphone_config_new_with_factory(const char *config_filename, const char *factory_config_filename);
+
+/**
+ * Reads a user config file and fill the #LinphoneConfig with the read config values.
+ * @ingroup misc
+ * @param lpconfig The #LinphoneConfig object to fill with the content of the file
+ * @param filename The filename of the config file to read to fill the #LinphoneConfig
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_config_read_file(LinphoneConfig *lpconfig, const char *filename);
+
+/**
+ * Reads a xml config file and fill the #LinphoneConfig with the read config dynamic values.
+ * @ingroup misc
+ * @param lpconfig The #LinphoneConfig object to fill with the content of the file
+ * @param filename The filename of the config file to read to fill the #LinphoneConfig
+ */
+LINPHONE_PUBLIC const char* linphone_config_load_from_xml_file(LinphoneConfig *lpc, const char *filename);
+
+/**
+ * Reads a xml config string and fill the #LinphoneConfig with the read config dynamic values.
+ * @ingroup misc
+ * @param lpconfig The #LinphoneConfig object to fill with the content of the file
+ * @param buffer The string of the config file to fill the #LinphoneConfig
+ * @return 0 in case of success
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_config_load_from_xml_string(LpConfig *lpc, const char *buffer);
+
+/**
+ * Retrieves a configuration item as a string, given its section, key, and default value.
+ *
+ * The default value string is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC const char *linphone_config_get_string(const LinphoneConfig *lpconfig, const char *section, const char *key, const char *default_string);
+
+/**
+ * Retrieves a configuration item as a list of strings, given its section, key, and default value.
+ * The default value is returned if the config item is not found.
+ * @param[in] lpconfig A #LinphoneConfig object
+ * @param[in] section The section from which to retrieve a configuration item
+ * @param[in] key The name of the configuration item to retrieve
+ * @param[in] default_list \bctbx_list{const char *}
+ * @return \bctbx_list{const char *}
+ */
+LINPHONE_PUBLIC bctbx_list_t * linphone_config_get_string_list(const LinphoneConfig *lpconfig, const char *section, const char *key, bctbx_list_t *default_list);
+
+/**
+ * Retrieves a configuration item as a range, given its section, key, and default min and max values.
+ *
+ * @return TRUE if the value is successfully parsed as a range, FALSE otherwise.
+ * If FALSE is returned, min and max are filled respectively with default_min and default_max values.
+ */
+LINPHONE_PUBLIC bool_t linphone_config_get_range(const LinphoneConfig *lpconfig, const char *section, const char *key, int *min, int *max, int default_min, int default_max);
+
+/**
+ * Retrieves a configuration item as an integer, given its section, key, and default value.
+ *
+ * The default integer value is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC int linphone_config_get_int(const LinphoneConfig *lpconfig,const char *section, const char *key, int default_value);
+
+/**
+ * Retrieves a configuration item as a boolean, given its section, key, and default value.
+ *
+ * The default boolean value is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC bool_t linphone_config_get_bool(const LpConfig *lpconfig, const char *section, const char *key, bool_t default_value);
+
+/**
+ * Retrieves a configuration item as a 64 bit integer, given its section, key, and default value.
+ *
+ * The default integer value is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC int64_t linphone_config_get_int64(const LinphoneConfig *lpconfig,const char *section, const char *key, int64_t default_value);
+
+/**
+ * Retrieves a configuration item as a float, given its section, key, and default value.
+ *
+ * The default float value is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC float linphone_config_get_float(const LinphoneConfig *lpconfig,const char *section, const char *key, float default_value);
+
+/**
+ * Sets a string config item
+**/
+LINPHONE_PUBLIC void linphone_config_set_string(LinphoneConfig *lpconfig,const char *section, const char *key, const char *value);
+
+/**
+ * Sets a string list config item
+ * @param[in] lpconfig A #LinphoneConfig object
+ * @param[in] section The name of the section to put the configuration item into
+ * @param[in] key The name of the configuration item to set
+ * @param[in] value \bctbx_list{const char *} The value to set
+ */
+LINPHONE_PUBLIC void linphone_config_set_string_list(LinphoneConfig *lpconfig, const char *section, const char *key, const bctbx_list_t *value);
+
+/**
+ * Sets a range config item
+ */
+LINPHONE_PUBLIC void linphone_config_set_range(LinphoneConfig *lpconfig, const char *section, const char *key, int min_value, int max_value);
+
+/**
+ * Sets an integer config item
+**/
+LINPHONE_PUBLIC void linphone_config_set_int(LinphoneConfig *lpconfig,const char *section, const char *key, int value);
+
+/**
+ * Sets a boolean config item
+**/
+LINPHONE_PUBLIC void linphone_config_set_bool(LinphoneConfig *lpconfig,const char *section, const char *key, bool_t value);
+
+/**
+ * Sets an integer config item, but store it as hexadecimal
+**/
+LINPHONE_PUBLIC void linphone_config_set_int_hex(LinphoneConfig *lpconfig,const char *section, const char *key, int value);
+
+/**
+ * Sets a 64 bits integer config item
+**/
+LINPHONE_PUBLIC void linphone_config_set_int64(LinphoneConfig *lpconfig,const char *section, const char *key, int64_t value);
+
+/**
+ * Sets a float config item
+**/
+LINPHONE_PUBLIC void linphone_config_set_float(LinphoneConfig *lpconfig,const char *section, const char *key, float value);
+
+/**
+ * Writes the config file to disk.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_config_sync(LinphoneConfig *lpconfig);
+
+/**
+ * Returns 1 if a given section is present in the configuration.
+**/
+LINPHONE_PUBLIC int linphone_config_has_section(const LinphoneConfig *lpconfig, const char *section);
+
+/**
+ * Removes every pair of key,value in a section and remove the section.
+**/
+LINPHONE_PUBLIC void linphone_config_clean_section(LinphoneConfig *lpconfig, const char *section);
+
+/**
+ * Returns 1 if a given section  with a given key is present in the configuration.
+ * @param[in] lpconfig The #LinphoneConfig object
+ * @param[in] section
+ * @param[in] key
+ **/
+LINPHONE_PUBLIC int linphone_config_has_entry(const LinphoneConfig *lpconfig, const char *section, const char *key);
+
+/**
+ * Removes entries for key,value in a section.
+ * @param[in] lpconfig The #LinphoneConfig object
+ * @param[in] section
+ * @param[in] key
+ **/
+LINPHONE_PUBLIC void linphone_config_clean_entry(LinphoneConfig *lpconfig, const char *section, const char *key);
+
+/**
+ * Returns the list of sections' names in the LinphoneConfig.
+ * @param[in] lpconfig The #LinphoneConfig object
+ * @return a null terminated static array of strings
+ * @deprecated use linphone_config_get_sections_names_list instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC const char** linphone_config_get_sections_names(LinphoneConfig *lpconfig);
+
+/**
+ * Returns the list of sections' names in the LinphoneConfig.
+ * @param[in] lpconfig The #LinphoneConfig object
+ * @return \bctbx_list{char *} a null terminated static array of strings
+**/
+LINPHONE_PUBLIC const bctbx_list_t * linphone_config_get_sections_names_list(LpConfig *lpconfig);
+
+/**
+ * @brief Call a function for each section present in the configuration.
+ * @donotwrap
+**/
+void linphone_config_for_each_section(const LinphoneConfig *lpconfig, void (*callback)(const char *section, void *ctx), void *ctx);
+
+/**
+ * @brief Call a function for each entry present in a section configuration.
+ * @donotwrap
+**/
+void linphone_config_for_each_entry(const LinphoneConfig *lpconfig, const char *section, void (*callback)(const char *entry, void *ctx), void *ctx);
+
+/*tells whether uncommited (with linphone_config_sync()) modifications exist*/
+bool_t linphone_config_needs_commit(const LinphoneConfig *lpconfig);
+
+LINPHONE_PUBLIC void linphone_config_destroy(LinphoneConfig *cfg);
+
+/**
+ * Retrieves a default configuration item as an integer, given its section, key, and default value.
+ * The default integer value is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC int linphone_config_get_default_int(const LinphoneConfig *lpconfig, const char *section, const char *key, int default_value);
+
+/**
+ * Retrieves a default configuration item as a 64 bit integer, given its section, key, and default value.
+ * The default integer value is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC int64_t linphone_config_get_default_int64(const LinphoneConfig *lpconfig, const char *section, const char *key, int64_t default_value);
+
+/**
+ * Retrieves a default configuration item as a float, given its section, key, and default value.
+ * The default float value is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC float linphone_config_get_default_float(const LinphoneConfig *lpconfig, const char *section, const char *key, float default_value);
+
+/**
+ * Retrieves a default configuration item as a string, given its section, key, and default value.
+ * The default value string is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC const char* linphone_config_get_default_string(const LinphoneConfig *lpconfig, const char *section, const char *key, const char *default_value);
+
+/**
+ * Retrieves a section parameter item as a string, given its section and key.
+ * The default value string is returned if the config item isn't found.
+**/
+LINPHONE_PUBLIC const char* linphone_config_get_section_param_string(const LinphoneConfig *lpconfig, const char *section, const char *key, const char *default_value);
+
+/**
+ * increment reference count
+**/
+LINPHONE_PUBLIC LinphoneConfig *linphone_config_ref(LinphoneConfig *lpconfig);
+
+/**
+ * Decrement reference count, which will eventually free the object.
+**/
+LINPHONE_PUBLIC void linphone_config_unref(LinphoneConfig *lpconfig);
+
+/**
+ * Write a string in a file placed relatively with the Linphone configuration file.
+ * @param lpconfig #LinphoneConfig instance used as a reference
+ * @param filename Name of the file where to write data. The name is relative to the place of the config file
+ * @param data String to write
+ */
+LINPHONE_PUBLIC void linphone_config_write_relative_file(const LinphoneConfig *lpconfig, const char *filename, const char *data);
+
+/**
+ * Read a string from a file placed beside the Linphone configuration file
+ * @param lpconfig #LinphoneConfig instance used as a reference
+ * @param filename Name of the file where data will be read from. The name is relative to the place of the config file
+ * @param data Buffer where read string will be stored
+ * @param max_length Length of the buffer
+ * @return 0 on success, -1 on failure
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_config_read_relative_file(const LinphoneConfig *lpconfig, const char *filename, char *data, size_t max_length);
+
+/**
+ * @return TRUE if file exists relative to the to the current location
+**/
+LINPHONE_PUBLIC bool_t linphone_config_relative_file_exists(const LinphoneConfig *lpconfig, const char *filename);
+
+/**
+ * Dumps the #LinphoneConfig as XML into a buffer
+ * @param[in] lpconfig The #LinphoneConfig object
+ * @return The buffer that contains the XML dump
+**/
+LINPHONE_PUBLIC char* linphone_config_dump_as_xml(const LinphoneConfig *lpconfig);
+
+/**
+ * Dumps the #LinphoneConfig as INI into a buffer
+ * @param[in] lpconfig The #LinphoneConfig object
+ * @return The buffer that contains the config dump
+**/
+LINPHONE_PUBLIC char* linphone_config_dump(const LinphoneConfig *lpconfig);
+
+/**
+ * Retrieves the overwrite flag for a config item
+**/
+LINPHONE_PUBLIC bool_t linphone_config_get_overwrite_flag_for_entry(const LinphoneConfig *lpconfig, const char *section, const char *key);
+
+/**
+ * Sets the overwrite flag for a config item (used when dumping config as xml)
+**/
+LINPHONE_PUBLIC void linphone_config_set_overwrite_flag_for_entry(LinphoneConfig *lpconfig, const char *section, const char *key, bool_t value);
+
+/**
+ * Retrieves the overwrite flag for a config section
+**/
+LINPHONE_PUBLIC bool_t linphone_config_get_overwrite_flag_for_section(const LinphoneConfig *lpconfig, const char *section);
+
+/**
+ * Sets the overwrite flag for a config section (used when dumping config as xml)
+**/
+LINPHONE_PUBLIC void linphone_config_set_overwrite_flag_for_section(LinphoneConfig *lpconfig, const char *section, bool_t value);
+
+/**
+ * Retrieves the skip flag for a config item
+**/
+LINPHONE_PUBLIC bool_t linphone_config_get_skip_flag_for_entry(const LinphoneConfig *lpconfig, const char *section, const char *key);
+
+/**
+ * Sets the skip flag for a config item (used when dumping config as xml)
+**/
+LINPHONE_PUBLIC void linphone_config_set_skip_flag_for_entry(LinphoneConfig *lpconfig, const char *section, const char *key, bool_t value);
+
+/**
+ * Retrieves the skip flag for a config section
+**/
+LINPHONE_PUBLIC bool_t linphone_config_get_skip_flag_for_section(const LinphoneConfig *lpconfig, const char *section);
+
+/**
+ * Sets the skip flag for a config section (used when dumping config as xml)
+**/
+LINPHONE_PUBLIC void linphone_config_set_skip_flag_for_section(LinphoneConfig *lpconfig, const char *section, bool_t value);
+
+/**
+ * Converts a config section into a dictionary.
+ * @return a dictionary with all the keys from a section, or NULL if the section doesn't exist
+ */
+LINPHONE_PUBLIC LinphoneDictionary * lp_config_section_to_dict( const LpConfig* lpconfig, const char* section );
+
+/**
+ * Loads a dictionary into a section of the lpconfig. If the section doesn't exist it is created.
+ * Overwrites existing keys, creates non-existing keys.
+ */
+LINPHONE_PUBLIC void lp_config_load_dict_to_section( LpConfig* lpconfig, const char* section, const LinphoneDictionary* dict);
+
+#ifdef __cplusplus
+}
+#endif
+
+// Define old function names for backward compatibility
+#define lp_config_new linphone_config_new
+#define lp_config_new_from_buffer linphone_config_new_from_buffer
+#define lp_config_new_with_factory linphone_config_new_with_factory
+#define lp_config_read_file linphone_config_read_file
+#define lp_config_get_string linphone_config_get_string
+#define lp_config_get_string_list linphone_config_get_string_list
+#define lp_config_get_range linphone_config_get_range
+#define lp_config_get_int linphone_config_get_int
+#define lp_config_get_int64 linphone_config_get_int64
+#define lp_config_get_float linphone_config_get_float
+#define lp_config_set_string linphone_config_set_string
+#define lp_config_set_string_list linphone_config_set_string_list
+#define lp_config_set_range linphone_config_set_range
+#define lp_config_set_int linphone_config_set_int
+#define lp_config_set_int_hex linphone_config_set_int_hex
+#define lp_config_set_int64 linphone_config_set_int64
+#define lp_config_set_float linphone_config_set_float
+#define lp_config_sync linphone_config_sync
+#define lp_config_has_section linphone_config_has_section
+#define lp_config_clean_section linphone_config_clean_section
+#define lp_config_has_entry linphone_config_has_entry
+#define lp_config_clean_entry linphone_config_clean_entry
+#define lp_config_get_sections_names linphone_config_get_sections_names
+#define lp_config_for_each_section linphone_config_for_each_section
+#define lp_config_for_each_entry linphone_config_for_each_entry
+#define lp_config_needs_commit linphone_config_needs_commit
+#define lp_config_destroy linphone_config_destroy
+#define lp_config_get_default_int linphone_config_get_default_int
+#define lp_config_get_default_int64 linphone_config_get_default_int64
+#define lp_config_get_default_float linphone_config_get_default_float
+#define lp_config_get_default_string linphone_config_get_default_string
+#define lp_config_get_section_param_string linphone_config_get_section_param_string
+#define lp_config_ref linphone_config_ref
+#define lp_config_unref linphone_config_unref
+#define lp_config_write_relative_file linphone_config_write_relative_file
+#define lp_config_read_relative_file linphone_config_read_relative_file
+#define lp_config_relative_file_exists linphone_config_relative_file_exists
+#define lp_config_dump_as_xml linphone_config_dump_as_xml
+#define lp_config_dump linphone_config_dump
+#define lp_config_get_overwrite_flag_for_entry linphone_config_get_overwrite_flag_for_entry
+#define lp_config_set_overwrite_flag_for_entry linphone_config_set_overwrite_flag_for_entry
+#define lp_config_get_overwrite_flag_for_section linphone_config_get_overwrite_flag_for_section
+#define lp_config_set_overwrite_flag_for_section linphone_config_set_overwrite_flag_for_section
+#define lp_config_get_skip_flag_for_entry linphone_config_get_skip_flag_for_entry
+#define lp_config_set_skip_flag_for_entry linphone_config_set_skip_flag_for_entry
+#define lp_config_get_skip_flag_for_section linphone_config_get_skip_flag_for_section
+#define lp_config_set_skip_flag_for_section linphone_config_set_skip_flag_for_section
+
+/**
+ * @}
+ */
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/misc.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/misc.h"
new file mode 100644
index 0000000..9b25b60
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/misc.h"
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_MISC_H_
+#define LINPHONE_MISC_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * Lowest volume measurement that can be returned by linphone_call_get_play_volume() or linphone_call_get_record_volume(), corresponding to pure silence.
+ * @ingroup call_misc
+**/
+#define LINPHONE_VOLUME_DB_LOWEST (-120) /* WARNING: keep this in sync with mediastreamer2/msvolume.h */
+
+
+/**
+ * Disable a sip transport
+ * Use with #LinphoneSipTransports
+ * @ingroup initializing
+ */
+#define LC_SIP_TRANSPORT_DISABLED 0
+/**
+ * Randomly chose a sip port for this transport
+ * Use with #LinphoneSipTransports
+ * @ingroup initializing
+ */
+#define LC_SIP_TRANSPORT_RANDOM (-1)
+
+/**
+ * Don't create any server socket for this transport, ie don't bind on any port.
+ * Use with #LinphoneSipTransports
+ * @ingroup initializing
+**/
+#define LC_SIP_TRANSPORT_DONTBIND (-2)
+
+
+/**
+ * Function returning a human readable value for LinphoneStreamType.
+ * @ingroup initializing
+ **/
+LINPHONE_PUBLIC const char *linphone_stream_type_to_string(const LinphoneStreamType);
+
+/**
+ * Human readable version of the #LinphoneRegistrationState
+ * @param cs sate
+ * @ingroup proxies
+ */
+LINPHONE_PUBLIC const char *linphone_registration_state_to_string(LinphoneRegistrationState cs);
+
+/**
+ * Convert enum member to string.
+ * @ingroup media_parameters
+**/
+LINPHONE_PUBLIC const char *linphone_media_encryption_to_string(LinphoneMediaEncryption menc);
+
+LINPHONE_PUBLIC const char* linphone_privacy_to_string(LinphonePrivacy privacy);
+
+LINPHONE_PUBLIC const char *linphone_subscription_state_to_string(LinphoneSubscriptionState state);
+
+LINPHONE_PUBLIC const char *linphone_publish_state_to_string(LinphonePublishState state);
+
+LINPHONE_PUBLIC const char *linphone_ice_state_to_string(LinphoneIceState state);
+
+LINPHONE_PUBLIC const char *linphone_global_state_to_string(LinphoneGlobalState gs);
+
+LINPHONE_PUBLIC const char *linphone_core_log_collection_upload_state_to_string(const LinphoneCoreLogCollectionUploadState lcus);
+
+LINPHONE_PUBLIC const char *linphone_call_state_to_string(LinphoneCallState cs);
+
+/**
+ * Converts a _LinphoneConfiguringState enum to a string.
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC const char *linphone_configuring_state_to_string(LinphoneConfiguringState cs);
+
+/**
+ * Returns a #LinphoneChatMessageState as a string.
+ */
+LINPHONE_PUBLIC	const char* linphone_chat_message_state_to_string(const LinphoneChatMessageState state);
+
+/**
+ * Converts a #LinphoneReason enum to a string.
+ * @param[in] err A #LinphoneReason
+ * @return The string representation of the specified #LinphoneReason
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC const char *linphone_reason_to_string(LinphoneReason err);
+
+/**
+ * Return humain readable presence status
+ * @param ss
+ * @deprecated Use #LinphonePresenceModel, #LinphonePresenceActivity and linphone_presence_activity_to_string() instead.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const char *linphone_online_status_to_string(LinphoneOnlineStatus ss);
+
+/**
+ * Convert a string into #LinphoneTunnelMode enum
+ * @param string String to convert
+ * @return An #LinphoneTunnelMode enum. If the passed string is NULL or
+ * does not match with any mode, the #LinphoneTunnelModeDisable is returned.
+ */
+LINPHONE_PUBLIC LinphoneTunnelMode linphone_tunnel_mode_from_string(const char *string);
+
+/**
+ * Convert a tunnel mode enum into string
+ * @param mode Enum to convert
+ * @return "disable", "enable" or "auto"
+ */
+LINPHONE_PUBLIC const char *linphone_tunnel_mode_to_string(LinphoneTunnelMode mode);
+
+/**
+ * Check whether Matroksa format is supported by the player
+ * @return TRUE if it is supported
+ */
+LINPHONE_PUBLIC bool_t linphone_local_player_matroska_supported(void);
+
+/**
+ * Converts a #LinphoneTransportType enum to a lowercase string.
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC const char* linphone_transport_to_string(LinphoneTransportType transport);
+
+/**
+ * Converts a lowercase string to a #LinphoneTransportType enum.
+ * @ingroup misc
+ * @return Transport matching input, or #LinphoneTransportUdp if nothing is found
+**/
+LINPHONE_PUBLIC LinphoneTransportType linphone_transport_parse(const char* transport);
+
+/**
+* Check whether an error code is in Retry-After field.
+* @param[in] err An error code
+* @return TRUE if it is in Retry-After field
+* @ingroup misc
+**/
+LINPHONE_PUBLIC bool_t linphone_error_code_is_retry_after(int err);
+
+/**
+ * Converts an error code to a LinphoneReason.
+ * @param[in] err An error code
+ * @return The #LinphoneReason corresponding to the specified error code
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneReason linphone_error_code_to_reason(int err);
+
+/**
+ * Converts a #LinphoneReason to an error code.
+ * @param[in] reason A #LinphoneReason
+ * @return The error code corresponding to the specified #LinphoneReason
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC int linphone_reason_to_error_code(LinphoneReason reason);
+
+/**
+ * Increment refcount.
+ * @param[in] range #LinphoneRange object
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC LinphoneRange *linphone_range_ref(LinphoneRange *range);
+
+/**
+ * Decrement refcount and possibly free the object.
+ * @param[in] range #LinphoneRange object
+ * @ingroup misc
+**/
+LINPHONE_PUBLIC void linphone_range_unref(LinphoneRange *range);
+
+/**
+ * Gets the user data in the #LinphoneRange object
+ * @param[in] range the #LinphoneRange
+ * @return the user data
+ * @ingroup misc
+*/
+LINPHONE_PUBLIC void *linphone_range_get_user_data(const LinphoneRange *range);
+
+/**
+ * Sets the user data in the #LinphoneRange object
+ * @param[in] range the #LinphoneRange object
+ * @param[in] data the user data
+ * @ingroup misc
+*/
+LINPHONE_PUBLIC void linphone_range_set_user_data(LinphoneRange *range, void *data);
+
+/**
+ * Gets the lower value of the range
+ * @param[in] range a #LinphoneRange
+ * @return The lower value
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC int linphone_range_get_min(const LinphoneRange *range);
+
+/**
+ * Gets the higher value of the range
+ * @param[in] range a #LinphoneRange
+ * @return The higher value
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC int linphone_range_get_max(const LinphoneRange *range);
+
+/**
+ * Sets the lower value of the range
+ * @param[in] range a #LinphoneRange
+ * @param[in] min the value to set
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC void linphone_range_set_min(LinphoneRange *range, int min);
+
+/**
+ * Sets the higher value of the range
+ * @param[in] range a #LinphoneRange
+ * @param[in] max the value to set
+ * @ingroup misc
+ */
+LINPHONE_PUBLIC void linphone_range_set_max(LinphoneRange *range, int max);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_MISC_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/nat_policy.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/nat_policy.h"
new file mode 100644
index 0000000..ff32157
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/nat_policy.h"
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_NAT_POLICY_H_
+#define LINPHONE_NAT_POLICY_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup network_parameters
+ * @{
+ */
+
+/**
+ * Acquire a reference to the #LinphoneNatPolicy object.
+ * @param[in] policy #LinphoneNatPolicy object.
+ * @return The same #LinphoneNatPolicy object.
+**/
+LINPHONE_PUBLIC LinphoneNatPolicy * linphone_nat_policy_ref(LinphoneNatPolicy *policy);
+
+/**
+ * Release reference to the #LinphoneNatPolicy object.
+ * @param[in] policy #LinphoneNatPolicy object.
+**/
+LINPHONE_PUBLIC void linphone_nat_policy_unref(LinphoneNatPolicy *policy);
+
+/**
+ * Retrieve the user pointer associated with the #LinphoneNatPolicy object.
+ * @param[in] policy #LinphoneNatPolicy object.
+ * @return The user pointer associated with the #LinphoneNatPolicy object.
+**/
+LINPHONE_PUBLIC void *linphone_nat_policy_get_user_data(const LinphoneNatPolicy *policy);
+
+/**
+ * Assign a user pointer to the #LinphoneNatPolicy object.
+ * @param[in] policy #LinphoneNatPolicy object.
+ * @param[in] ud The user pointer to associate with the #LinphoneNatPolicy object.
+**/
+LINPHONE_PUBLIC void linphone_nat_policy_set_user_data(LinphoneNatPolicy *policy, void *ud);
+
+/**
+ * Clear a NAT policy (deactivate all protocols and unset the STUN server).
+ * @param[in] policy #LinphoneNatPolicy object.
+ */
+LINPHONE_PUBLIC void linphone_nat_policy_clear(LinphoneNatPolicy *policy);
+
+/**
+ * Tell whether STUN is enabled.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @return Boolean value telling whether STUN is enabled.
+ */
+LINPHONE_PUBLIC bool_t linphone_nat_policy_stun_enabled(const LinphoneNatPolicy *policy);
+
+/**
+ * Enable STUN.
+ * If TURN is also enabled, TURN will be used instead of STUN.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @param[in] enable Boolean value telling whether to enable STUN.
+ */
+LINPHONE_PUBLIC void linphone_nat_policy_enable_stun(LinphoneNatPolicy *policy, bool_t enable);
+
+/**
+ * Tell whether TURN is enabled.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @return Boolean value telling whether TURN is enabled.
+ */
+LINPHONE_PUBLIC bool_t linphone_nat_policy_turn_enabled(const LinphoneNatPolicy *policy);
+
+/**
+ * Enable TURN.
+ * If STUN is also enabled, it is ignored and TURN is used.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @param[in] enable Boolean value telling whether to enable TURN.
+ */
+LINPHONE_PUBLIC void linphone_nat_policy_enable_turn(LinphoneNatPolicy *policy, bool_t enable);
+
+/**
+ * Tell whether ICE is enabled.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @return Boolean value telling whether ICE is enabled.
+ */
+LINPHONE_PUBLIC bool_t linphone_nat_policy_ice_enabled(const LinphoneNatPolicy *policy);
+
+/**
+ * Enable ICE.
+ * ICE can be enabled without STUN/TURN, in which case only the local candidates will be used.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @param[in] enable Boolean value telling whether to enable ICE.
+ */
+LINPHONE_PUBLIC void linphone_nat_policy_enable_ice(LinphoneNatPolicy *policy, bool_t enable);
+
+/**
+ * Tell whether uPnP is enabled.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @return Boolean value telling whether uPnP is enabled.
+ */
+LINPHONE_PUBLIC bool_t linphone_nat_policy_upnp_enabled(const LinphoneNatPolicy *policy);
+
+/**
+ * Enable uPnP.
+ * This has the effect to disable every other policies (ICE, STUN and TURN).
+ * @param[in] policy #LinphoneNatPolicy object
+ * @param[in] enable Boolean value telling whether to enable uPnP.
+ */
+LINPHONE_PUBLIC void linphone_nat_policy_enable_upnp(LinphoneNatPolicy *policy, bool_t enable);
+
+/**
+ * Get the STUN/TURN server to use with this NAT policy.
+ * Used when STUN or TURN are enabled.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @return The STUN server used by this NAT policy.
+ */
+LINPHONE_PUBLIC const char * linphone_nat_policy_get_stun_server(const LinphoneNatPolicy *policy);
+
+/**
+ * Set the STUN/TURN server to use with this NAT policy.
+ * Used when STUN or TURN are enabled.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @param[in] stun_server The STUN server to use with this NAT policy.
+ */
+LINPHONE_PUBLIC void linphone_nat_policy_set_stun_server(LinphoneNatPolicy *policy, const char *stun_server);
+
+/**
+ * Get the username used to authenticate with the STUN/TURN server.
+ * The authentication will search for a #LinphoneAuthInfo with this username.
+ * If it is not set the username of the currently used #LinphoneProxyConfig is used to search for a LinphoneAuthInfo.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @return The username used to authenticate with the STUN/TURN server.
+ */
+LINPHONE_PUBLIC const char * linphone_nat_policy_get_stun_server_username(const LinphoneNatPolicy *policy);
+
+/**
+ * Set the username used to authenticate with the STUN/TURN server.
+ * The authentication will search for a #LinphoneAuthInfo with this username.
+ * If it is not set the username of the currently used #LinphoneProxyConfig is used to search for a LinphoneAuthInfo.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @param[in] username The username used to authenticate with the STUN/TURN server.
+ */
+LINPHONE_PUBLIC void linphone_nat_policy_set_stun_server_username(LinphoneNatPolicy *policy, const char *username);
+
+/**
+ * Start a STUN server DNS resolution.
+ * @param[in] policy #LinphoneNatPolicy object
+ */
+LINPHONE_PUBLIC void linphone_nat_policy_resolve_stun_server(LinphoneNatPolicy *policy);
+
+/**
+ * Get the addrinfo representation of the STUN server address.
+ * WARNING: This function may block for up to 1 second.
+ * @param[in] policy #LinphoneNatPolicy object
+ * @return addrinfo representation of the STUN server address.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC const struct addrinfo * linphone_nat_policy_get_stun_server_addrinfo(LinphoneNatPolicy *policy);
+
+/**
+ * Returns the #LinphoneCore object managing this nat policy, if any.
+ * @param[in] fr #LinphoneNatPolicy object
+ */
+LINPHONE_PUBLIC LinphoneCore *linphone_nat_policy_get_core(const LinphoneNatPolicy *policy);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_NAT_POLICY_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/payload_type.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/payload_type.h"
new file mode 100644
index 0000000..ae12f75
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/payload_type.h"
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_PAYLOAD_TYPE_H_
+#define LINPHONE_PAYLOAD_TYPE_H_
+
+#include "linphone/types.h"
+
+/**
+ * @addtogroup media_parameters
+ * @{
+**/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Take a reference on a #LinphonePayloadType.
+ */
+LINPHONE_PUBLIC LinphonePayloadType *linphone_payload_type_ref(LinphonePayloadType *pt);
+
+/**
+ * Release a reference on a #LinphonePayloadType.
+ */
+LINPHONE_PUBLIC void linphone_payload_type_unref(LinphonePayloadType *pt);
+
+/**
+ * Get the type of a payload type.
+ * @param[in] pt The payload type.
+ * @return The type of the payload e.g. PAYLOAD_AUDIO_CONTINUOUS or PAYLOAD_VIDEO.
+ */
+LINPHONE_PUBLIC int linphone_payload_type_get_type(const LinphonePayloadType *pt);
+
+/**
+ * Enable/disable a payload type.
+ * @param[in] pt The payload type to enable/disable.
+ * @param[in] enabled Set TRUE for enabling and FALSE for disabling.
+ * @return 0 for success, -1 for failure.
+ */
+LINPHONE_PUBLIC int linphone_payload_type_enable(LinphonePayloadType *pt, bool_t enabled);
+
+/**
+ * Check whether a palyoad type is enabled.
+ * @return TRUE if enabled, FALSE if disabled.
+ */
+LINPHONE_PUBLIC bool_t linphone_payload_type_enabled(const LinphonePayloadType *pt);
+
+/**
+ * Return a string describing a payload type. The format of the string is
+ * &lt;mime_type&gt;/&lt;clock_rate&gt;/&lt;channels&gt;.
+ * @param[in] pt The payload type.
+ * @return The description of the payload type. Must be release after use.
+ */
+LINPHONE_PUBLIC char *linphone_payload_type_get_description(const LinphonePayloadType *pt);
+
+/**
+ * Get a description of the encoder used to provide a payload type.
+ * @param[in] pt The payload type.
+ * @return The description of the encoder. Can be NULL if the payload type is not supported by Mediastreamer2.
+ */
+LINPHONE_PUBLIC const char *linphone_payload_type_get_encoder_description(const LinphonePayloadType *pt);
+
+/**
+ * Get the normal bitrate in bits/s.
+ * @param[in] pt The payload type.
+ * @return The normal bitrate in bits/s or -1 if an error has occured.
+ */
+LINPHONE_PUBLIC int linphone_payload_type_get_normal_bitrate(const LinphonePayloadType *pt);
+
+/**
+ * Change the normal bitrate of a payload type..
+ * @param[in] pt The payload type to change.
+ * @param[in] bitrate The new bitrate in bits/s.
+ */
+LINPHONE_PUBLIC void linphone_payload_type_set_normal_bitrate(LinphonePayloadType *pt, int bitrate);
+
+/**
+ * Get the mime type.
+ * @param[in] pt The payload type.
+ * @return The mime type.
+ */
+LINPHONE_PUBLIC const char * linphone_payload_type_get_mime_type(const LinphonePayloadType *pt);
+
+/**
+ * Get the number of channels.
+ * @param[in] pt The payload type.
+ * @return The number of channels.
+ */
+LINPHONE_PUBLIC int linphone_payload_type_get_channels(const LinphonePayloadType *pt);
+
+/**
+ * Returns the payload type number assigned for this codec.
+ * @param[in] pt The payload type.
+ * @return The number of the payload type.
+**/
+LINPHONE_PUBLIC int linphone_payload_type_get_number(const LinphonePayloadType *pt);
+
+/**
+ * Force a number for a payload type. The #LinphoneCore does payload type number assignment automatically.
+ * This function is mainly to be used for tests, in order to override the automatic assignment mechanism.
+ * @param[in] pt The payload type.
+ * @param[in] number The number to assign to the payload type.
+**/
+LINPHONE_PUBLIC void linphone_payload_type_set_number(LinphonePayloadType *pt, int number);
+
+/**
+ * Get the format parameters for incoming streams.
+ * @param[in] pt The payload type.
+ * @return The format parameters as string.
+ */
+LINPHONE_PUBLIC const char *linphone_payload_type_get_recv_fmtp(const LinphonePayloadType *pt);
+
+/**
+ * Set the format parameters for incoming streams.
+ * @param[in] pt The payload type.
+ * @param[in] recv_fmtp The new format parameters as string. The string will be copied.
+ */
+LINPHONE_PUBLIC void linphone_payload_type_set_recv_fmtp(LinphonePayloadType *pt, const char *recv_fmtp);
+
+/**
+ * Get the format parameters for outgoing streams.
+ * @param[in] pt The payload type.
+ * @return The format parameters as string.
+ */
+LINPHONE_PUBLIC const char *linphone_payload_type_get_send_fmtp(const LinphonePayloadType *pt);
+
+/**
+ * Set the format parameters for outgoing streams.
+ * @param[in] pt The payload type.
+ * @param[in] send_fmtp The new format parameters as string. The string will be copied.
+ */
+LINPHONE_PUBLIC void linphone_payload_type_set_send_fmtp(LinphonePayloadType *pt, const char *send_fmtp);
+
+/**
+ * Get the clock rate of a payload type.
+ * @param[in] pt The payload type.
+ * @return[in] The clock rate in Hz.
+ */
+LINPHONE_PUBLIC int linphone_payload_type_get_clock_rate(const LinphonePayloadType *pt);
+
+/**
+ * Tells whether the specified payload type represents a variable bitrate codec.
+ * @param[in] pt The payload type.
+ * @return TRUE if the payload type represents a VBR codec, FALSE instead.
+ */
+LINPHONE_PUBLIC bool_t linphone_payload_type_is_vbr(const LinphonePayloadType *pt);
+
+/**
+ * Check whether the payload is usable according the bandwidth targets set in the core.
+ * @param[in] pt The payload type to test.
+ * @return TRUE if the payload type is usable.
+ */
+LINPHONE_PUBLIC bool_t linphone_payload_type_is_usable(const LinphonePayloadType *pt);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @}
+**/
+
+#endif /* LINPHONE_PAYLOAD_TYPE_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/player.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/player.h"
new file mode 100644
index 0000000..4024816
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/player.h"
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_PLAYER_H_
+#define LINPHONE_PLAYER_H_
+
+
+#include "linphone/types.h"
+#include "mediastreamer2/msinterfaces.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup call_control
+ * @{
+ */
+
+/**
+ * Acquire a reference to the player.
+ * @param[in] player #LinphonePlayer object.
+ * @return The same #LinphonePlayer object.
+**/
+LINPHONE_PUBLIC LinphonePlayer * linphone_player_ref(LinphonePlayer *player);
+
+/**
+ * Release reference to the player.
+ * @param[in] player #LinphonePlayer object.
+**/
+LINPHONE_PUBLIC void linphone_player_unref(LinphonePlayer *player);
+
+/**
+ * Retrieve the user pointer associated with the player.
+ * @param[in] player #LinphonePlayer object.
+ * @return The user pointer associated with the player.
+**/
+LINPHONE_PUBLIC void *linphone_player_get_user_data(const LinphonePlayer *player);
+
+/**
+ * Assign a user pointer to the player.
+ * @param[in] player #LinphonePlayer object.
+ * @param[in] ud The user pointer to associate with the player.
+**/
+LINPHONE_PUBLIC void linphone_player_set_user_data(LinphonePlayer *player, void *ud);
+
+/**
+ * Get the #LinphonePlayerCbs object associated with the LinphonePlayer.
+ * @param[in] player #LinphonePlayer object
+ * @return The #LinphonePlayerCbs object associated with the LinphonePlayer.
+ * @deprecated use add_callbacks / remove_callbacks instead
+ */
+LINPHONE_PUBLIC LinphonePlayerCbs * linphone_player_get_callbacks(const LinphonePlayer *player);
+
+/**
+ * Adds a #LinphonePlayerCbs object associated to the LinphonePlayer.
+ * @param[in] player #LinphonePlayer object
+ * @param[in] cbs The #LinphonePlayerCbs object to be added to the LinphonePlayer.
+ */
+LINPHONE_PUBLIC void linphone_player_add_callbacks(LinphonePlayer *player, LinphonePlayerCbs *cbs);
+
+/**
+ * Removes a #LinphonePlayerCbs object associated to the LinphonePlayer.
+ * @param[in] player #LinphonePlayer object
+ * @param[in] cbs The #LinphonePlayerCbs object to be removed from the LinphonePlayer.
+ */
+LINPHONE_PUBLIC void linphone_player_remove_callbacks(LinphonePlayer *player, LinphonePlayerCbs *cbs);
+
+/**
+ * Returns the current LinphonePlayerCbsCbs object
+ * @param[in] player #LinphonePlayer object
+ * @return The current #LinphonePlayerCbs object
+ */
+LINPHONE_PUBLIC LinphonePlayerCbs *linphone_player_get_current_callbacks(const LinphonePlayer *player);
+
+/**
+ * Open a file for playing.
+ * @param[in] obj #LinphonePlayer object
+ * @param[in] filename The path to the file to open
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_player_open(LinphonePlayer *obj, const char *filename);
+
+/**
+ * Start playing a file that has been opened with linphone_player_open().
+ * @param[in] obj #LinphonePlayer object
+ * @return 0 on success, a negative value otherwise
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_player_start(LinphonePlayer *obj);
+
+/**
+ * Pause the playing of a file.
+ * @param[in] obj #LinphonePlayer object
+ * @return 0 on success, a negative value otherwise
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_player_pause(LinphonePlayer *obj);
+
+/**
+ * Seek in an opened file.
+ * @param[in] obj #LinphonePlayer object
+ * @param[in] time_ms The time we want to go to in the file (in milliseconds).
+ * @return 0 on success, a negative value otherwise.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_player_seek(LinphonePlayer *obj, int time_ms);
+
+/**
+ * Get the current state of a player.
+ * @param[in] obj #LinphonePlayer object
+ * @return The current state of the player.
+ */
+LINPHONE_PUBLIC LinphonePlayerState linphone_player_get_state(LinphonePlayer *obj);
+
+/**
+ * Get the duration of the opened file.
+ * @param[in] obj #LinphonePlayer object
+ * @return The duration of the opened file
+ */
+LINPHONE_PUBLIC int linphone_player_get_duration(LinphonePlayer *obj);
+
+/**
+ * Get the current position in the opened file.
+ * @param[in] obj #LinphonePlayer object
+ * @return The current position in the opened file
+ */
+LINPHONE_PUBLIC int linphone_player_get_current_position(LinphonePlayer *obj);
+
+/**
+ * Close the opened file.
+ * @param[in] obj #LinphonePlayer object
+ */
+LINPHONE_PUBLIC void linphone_player_close(LinphonePlayer *obj);
+
+/**
+ * Returns the #LinphoneCore object managing this player's call, if any.
+ * @param[in] fr #LinphonePlayer object
+ */
+LINPHONE_PUBLIC LinphoneCore *linphone_player_get_core(const LinphonePlayer *player);
+
+/**
+ * Acquire a reference to the #LinphonePlayerCbs object.
+ * @param[in] cbs #LinphonePlayerCbs object.
+ * @return The same #LinphonePlayerCbs object.
+ */
+LINPHONE_PUBLIC LinphonePlayerCbs * linphone_player_cbs_ref(LinphonePlayerCbs *cbs);
+
+/**
+ * Release reference to the #LinphonePlayerCbs object.
+ * @param[in] cbs #LinphonePlayerCbs object.
+ */
+LINPHONE_PUBLIC void linphone_player_cbs_unref(LinphonePlayerCbs *cbs);
+
+/**
+ * Retrieve the user pointer associated with the #LinphonePlayerCbs object.
+ * @param[in] cbs #LinphonePlayerCbs object.
+ * @return The user pointer associated with the #LinphonePlayerCbs object.
+ */
+LINPHONE_PUBLIC void *linphone_player_cbs_get_user_data(const LinphonePlayerCbs *cbs);
+
+/**
+ * Assign a user pointer to the #LinphonePlayerCbs object.
+ * @param[in] cbs #LinphonePlayerCbs object.
+ * @param[in] ud The user pointer to associate with the #LinphonePlayerCbs object.
+ */
+LINPHONE_PUBLIC void linphone_player_cbs_set_user_data(LinphonePlayerCbs *cbs, void *ud);
+
+/**
+ * Get the end-of-file reached callback.
+ * @param[in] cbs #LinphonePlayerCbs object.
+ * @return The current end-of-file reached callback.
+ */
+LINPHONE_PUBLIC LinphonePlayerCbsEofReachedCb linphone_player_cbs_get_eof_reached(const LinphonePlayerCbs *cbs);
+
+/**
+ * Set the end-of-file reached callback.
+ * @param[in] cbs #LinphonePlayerCbs object.
+ * @param[in] cb The end-of-file reached callback to be used.
+ */
+LINPHONE_PUBLIC void linphone_player_cbs_set_eof_reached(LinphonePlayerCbs *cbs, LinphonePlayerCbsEofReachedCb cb);
+
+/**
+ * @}
+**/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_PLAYER_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/presence.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/presence.h"
new file mode 100644
index 0000000..7d90a0c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/presence.h"
@@ -0,0 +1,829 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_PRESENCE_H_
+#define LINPHONE_PRESENCE_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup buddy_list
+ * @{
+ */
+
+/*****************************************************************************
+ * HELPER FUNCTIONS TO EASE ACCESS IN MOST SIMPLER CASES                     *
+ ****************************************************************************/
+
+/**
+ * Creates a presence model specifying an activity.
+ * @param[in] activity The activity to set for the created presence model.
+ * @param[in] description An additional description of the activity (mainly useful for the 'other' activity). Set it to NULL to not add a description.
+ * @return The created presence model, or NULL if an error occured.
+ * @see linphone_presence_model_new
+ * @see linphone_presence_model_new_with_activity_and_note
+ *
+ * The created presence model has the activity specified in the parameters.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_presence_model_new_with_activity(LinphonePresenceActivityType activity, const char *description);
+
+/**
+ * Creates a presence model specifying an activity and adding a note.
+ * @param[in] activity The activity to set for the created presence model.
+ * @param[in] description An additional description of the activity (mainly useful for the 'other' activity). Set it to NULL to not add a description.
+ * @param[in] note An additional note giving additional information about the contact presence.
+ * @param[in] lang The language the note is written in. It can be set to NULL in order to not specify the language of the note.
+ * @return The created presence model, or NULL if an error occured.
+ * @see linphone_presence_model_new_with_activity
+ * @see linphone_presence_model_new_with_activity_and_note
+ *
+ * The created presence model has the activity and the note specified in the parameters.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_presence_model_new_with_activity_and_note(LinphonePresenceActivityType activity, const char *description, const char *note, const char *lang);
+
+/**
+ * Gets the basic status of a presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the basic status from.
+ * @return The #LinphonePresenceBasicStatus of the #LinphonePresenceModel object given as parameter.
+ */
+LINPHONE_PUBLIC LinphonePresenceBasicStatus linphone_presence_model_get_basic_status(const LinphonePresenceModel *model);
+
+/**
+ *  Sets the basic status of a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to set the basic status.
+ * @param[in] basic_status The #LinphonePresenceBasicStatus to set for the #LinphonePresenceModel object.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_set_basic_status(LinphonePresenceModel *model, LinphonePresenceBasicStatus basic_status);
+
+/**
+ *  Gets the timestamp of a presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the timestamp from.
+ * @return The timestamp of the #LinphonePresenceModel object or -1 on error.
+ */
+LINPHONE_PUBLIC time_t linphone_presence_model_get_timestamp(const LinphonePresenceModel *model);
+
+/**
+ * Gets the contact of a presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the contact from.
+ * @return A pointer to a dynamically allocated string containing the contact, or NULL if no contact is found.
+ *
+ * The returned string is to be freed by calling ms_free().
+ */
+LINPHONE_PUBLIC char * linphone_presence_model_get_contact(const LinphonePresenceModel *model);
+
+/**
+ * Sets the contact of a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to set the contact.
+ * @param[in] contact The contact string to set.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_set_contact(LinphonePresenceModel *model, const char *contact);
+
+/**
+ * Sets the presentity of a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to set the contact.
+ * @param[in] presentity The presentity address to set (presentity is copied).
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_set_presentity(LinphonePresenceModel *model, const LinphoneAddress *presentity);
+
+/**
+ * Gets the presentity of a presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the contact from.
+ * @return A pointer to a const LinphoneAddress, or NULL if no contact is found.
+ *
+ */
+LINPHONE_PUBLIC const LinphoneAddress * linphone_presence_model_get_presentity(const LinphonePresenceModel *model);
+
+/**
+ * Gets the first activity of a presence model (there is usually only one).
+ * @param[in] model The #LinphonePresenceModel object to get the activity from.
+ * @return A #LinphonePresenceActivity object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresenceActivity * linphone_presence_model_get_activity(const LinphonePresenceModel *model);
+
+/**
+ * Sets the activity of a presence model (limits to only one activity).
+ * @param[in] model The #LinphonePresenceModel object for which to set the activity.
+ * @param[in] activity The #LinphonePresenceActivityType to set for the model.
+ * @param[in] description An additional description of the activity to set for the model. Can be NULL if no additional description is to be added.
+ * @return 0 if successful, a value < 0 in case of error.
+ *
+ * WARNING: This function will modify the basic status of the model according to the activity being set.
+ * If you don't want the basic status to be modified automatically, you can use the combination of linphone_presence_model_set_basic_status(),
+ * linphone_presence_model_clear_activities() and linphone_presence_model_add_activity().
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_set_activity(LinphonePresenceModel *model, LinphonePresenceActivityType activity, const char *description);
+
+/**
+ * Gets the number of activities included in the presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the number of activities from.
+ * @return The number of activities included in the #LinphonePresenceModel object.
+ */
+LINPHONE_PUBLIC unsigned int linphone_presence_model_get_nb_activities(const LinphonePresenceModel *model);
+
+/**
+ * Gets the nth activity of a presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the activity from.
+ * @param[in] idx The index of the activity to get (the first activity having the index 0).
+ * @return A pointer to a #LinphonePresenceActivity object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresenceActivity * linphone_presence_model_get_nth_activity(const LinphonePresenceModel *model, unsigned int idx);
+
+/**
+ * Adds an activity to a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to add an activity.
+ * @param[in] activity The #LinphonePresenceActivity object to add to the model.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_add_activity(LinphonePresenceModel *model, LinphonePresenceActivity *activity);
+
+/**
+ * Clears the activities of a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to clear the activities.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_clear_activities(LinphonePresenceModel *model);
+
+/**
+ * Gets the first note of a presence model (there is usually only one).
+ * @param[in] model The #LinphonePresenceModel object to get the note from.
+ * @param[in] lang The language of the note to get. Can be NULL to get a note that has no language specified or to get the first note whatever language it is written into.
+ * @return A pointer to a #LinphonePresenceNote object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresenceNote * linphone_presence_model_get_note(const LinphonePresenceModel *model, const char *lang);
+
+/**
+ * Adds a note to a presence model.
+ * @param[in] model The #LinphonePresenceModel object to add a note to.
+ * @param[in] note_content The note to be added to the presence model.
+ * @param[in] lang The language of the note to be added. Can be NULL if no language is to be specified for the note.
+ * @return 0 if successful, a value < 0 in case of error.
+ *
+ * Only one note for each language can be set, so e.g. setting a note for the 'fr' language if there is only one will replace the existing one.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_add_note(LinphonePresenceModel *model, const char *note_content, const char *lang);
+
+/**
+ * Clears all the notes of a presence model.
+ * @param[in] model The #LinphonePresenceModel for which to clear notes.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_clear_notes(LinphonePresenceModel *model);
+
+/**
+ * Get the consolidated presence from a presence model.
+ * @param[in] model #LinphonePresenceModel object
+ * @return The #LinphoneConsolidatedPresence corresponding to the presence model
+ */
+LINPHONE_PUBLIC LinphoneConsolidatedPresence linphone_presence_model_get_consolidated_presence(const LinphonePresenceModel *model);
+
+
+/*****************************************************************************
+ * PRESENCE MODEL FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES             *
+ ****************************************************************************/
+
+/**
+ * Creates a default presence model.
+ * @return The created presence model, NULL on error.
+ * @see linphone_presence_model_new_with_activity
+ * @see linphone_presence_model_new_with_activity_and_note
+ *
+ * The created presence model is considered 'offline'.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_presence_model_new(void);
+
+/**
+ * Gets the number of services included in the presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the number of services from.
+ * @return The number of services included in the #LinphonePresenceModel object.
+ */
+LINPHONE_PUBLIC unsigned int linphone_presence_model_get_nb_services(const LinphonePresenceModel *model);
+
+/**
+ * Gets the nth service of a presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the service from.
+ * @param[in] idx The index of the service to get (the first service having the index 0).
+ * @return A pointer to a #LinphonePresenceService object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresenceService * linphone_presence_model_get_nth_service(const LinphonePresenceModel *model, unsigned int idx);
+
+/**
+ * Adds a service to a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to add a service.
+ * @param[in] service The #LinphonePresenceService object to add to the model.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_add_service(LinphonePresenceModel *model, LinphonePresenceService *service);
+
+/**
+ * Clears the services of a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to clear the services.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_clear_services(LinphonePresenceModel *model);
+
+/**
+ * Gets the number of persons included in the presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the number of persons from.
+ * @return The number of persons included in the #LinphonePresenceModel object.
+ */
+LINPHONE_PUBLIC unsigned int linphone_presence_model_get_nb_persons(const LinphonePresenceModel *model);
+
+/**
+ * Gets the nth person of a presence model.
+ * @param[in] model The #LinphonePresenceModel object to get the person from.
+ * @param[in] idx The index of the person to get (the first person having the index 0).
+ * @return A pointer to a #LinphonePresencePerson object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresencePerson * linphone_presence_model_get_nth_person(const LinphonePresenceModel *model, unsigned int idx);
+
+/**
+ * Adds a person to a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to add a person.
+ * @param[in] person The #LinphonePresencePerson object to add to the model.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_add_person(LinphonePresenceModel *model, LinphonePresencePerson *person);
+
+/**
+ * Clears the persons of a presence model.
+ * @param[in] model The #LinphonePresenceModel object for which to clear the persons.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_model_clear_persons(LinphonePresenceModel *model);
+
+/**
+ * Tells whether a presence model is considered online.
+ * It is any of theses cases:
+ *  - basic status is'open' and no activities
+ *  - explicit 'online' tag in the status
+ * @param[in] model #LinphonePresenceModel object
+ * @return A boolean value telling whether the presence model is considered online or not.
+ */
+LINPHONE_PUBLIC bool_t linphone_presence_model_is_online(const LinphonePresenceModel *model);
+
+
+/*****************************************************************************
+ * PRESENCE SERVICE FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES           *
+ ****************************************************************************/
+
+/**
+ * Gets the string representation of a presence basic status.
+ * @param[in] basic_status A #LinphonePresenceBasicStatus for which to get a string representation.
+ * @return A pointer a dynamically allocated string representing the given basic status.
+ *
+ * The returned string is to be freed by calling ms_free().
+ */
+char * linphone_presence_basic_status_to_string(LinphonePresenceBasicStatus basic_status);
+
+/**
+ * Creates a presence service.
+ * @param[in] id The id of the presence service to be created. Can be NULL to generate it automatically.
+ * @param[in] basic_status The #LinphonePresenceBasicStatus to set for the #LinphonePresenceService object.
+ * @param[in] contact The contact string to set.
+ * @return The created presence service, NULL on error.
+ *
+ * The created presence service has the basic status 'closed'.
+ */
+LINPHONE_PUBLIC LinphonePresenceService * linphone_presence_service_new(const char *id, LinphonePresenceBasicStatus basic_status, const char *contact);
+
+/**
+ * Gets the id of a presence service.
+ * @param[in] service The #LinphonePresenceService object to get the id from.
+ * @return A pointer to a dynamically allocated string containing the id, or NULL in case of error.
+ *
+ * The returned string is to be freed by calling ms_free().
+ */
+LINPHONE_PUBLIC char * linphone_presence_service_get_id(const LinphonePresenceService *service);
+
+/**
+ * Sets the id of a presence service.
+ * @param[in] service The #LinphonePresenceService object for which to set the id.
+ * @param[in] id The id string to set. Can be NULL to generate it automatically.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_service_set_id(LinphonePresenceService *service, const char *id);
+
+/**
+ * Gets the basic status of a presence service.
+ * @param[in] service The #LinphonePresenceService object to get the basic status from.
+ * @return The #LinphonePresenceBasicStatus of the #LinphonePresenceService object given as parameter.
+ */
+LINPHONE_PUBLIC LinphonePresenceBasicStatus linphone_presence_service_get_basic_status(const LinphonePresenceService *service);
+
+/**
+ * Sets the basic status of a presence service.
+ * @param[in] service The #LinphonePresenceService object for which to set the basic status.
+ * @param[in] basic_status The #LinphonePresenceBasicStatus to set for the #LinphonePresenceService object.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_service_set_basic_status(LinphonePresenceService *service, LinphonePresenceBasicStatus basic_status);
+
+/**
+ * Gets the contact of a presence service.
+ * @param[in] service The #LinphonePresenceService object to get the contact from.
+ * @return A pointer to a dynamically allocated string containing the contact, or NULL if no contact is found.
+ *
+ * The returned string is to be freed by calling ms_free().
+ */
+LINPHONE_PUBLIC char * linphone_presence_service_get_contact(const LinphonePresenceService *service);
+
+/**
+ * Sets the contact of a presence service.
+ * @param[in] service The #LinphonePresenceService object for which to set the contact.
+ * @param[in] contact The contact string to set.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_service_set_contact(LinphonePresenceService *service, const char *contact);
+
+/**
+ * Gets the service descriptions of a presence service.
+ * @param[in] service The #LinphonePresenceService object to get the contact from.
+ * @return A \bctbx_list{char *} containing the services descriptions.
+ *
+ * The returned string is to be freed.
+ */
+LINPHONE_PUBLIC bctbx_list_t * linphone_presence_service_get_service_descriptions(const LinphonePresenceService *service);
+
+/**
+ * Sets the service descriptions of a presence service.
+ * @param[in] service The #LinphonePresenceService object for which to set the contact.
+ * @param[in] descriptions \bctbx_list{char *} The service descriptions.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_service_set_service_descriptions(LinphonePresenceService *service, bctbx_list_t *descriptions);
+
+/**
+ * Gets the number of notes included in the presence service.
+ * @param[in] service The #LinphonePresenceService object to get the number of notes from.
+ * @return The number of notes included in the #LinphonePresenceService object.
+ */
+LINPHONE_PUBLIC unsigned int linphone_presence_service_get_nb_notes(const LinphonePresenceService *service);
+
+/**
+ * Gets the nth note of a presence service.
+ * @param[in] service The #LinphonePresenceService object to get the note from.
+ * @param[in] idx The index of the note to get (the first note having the index 0).
+ * @return A pointer to a #LinphonePresenceNote object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresenceNote * linphone_presence_service_get_nth_note(const LinphonePresenceService *service, unsigned int idx);
+
+/**
+ * Adds a note to a presence service.
+ * @param[in] service The #LinphonePresenceService object for which to add a note.
+ * @param[in] note The #LinphonePresenceNote object to add to the service.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_service_add_note(LinphonePresenceService *service, LinphonePresenceNote *note);
+
+/**
+ * Clears the notes of a presence service.
+ * @param[in] service The #LinphonePresenceService object for which to clear the notes.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_service_clear_notes(LinphonePresenceService *service);
+
+
+/*****************************************************************************
+ * PRESENCE PERSON FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES            *
+ ****************************************************************************/
+
+/**
+ * Creates a presence person.
+ * @param[in] id The id of the presence person to be created. Can be NULL to generate it automatically.
+ * @return The created presence person, NULL on error.
+ */
+LINPHONE_PUBLIC LinphonePresencePerson * linphone_presence_person_new(const char *id);
+
+/**
+ * Gets the id of a presence person.
+ * @param[in] person The #LinphonePresencePerson object to get the id from.
+ * @return A pointer to a dynamically allocated string containing the id, or NULL in case of error.
+ *
+ * The returned string is to be freed by calling ms_free().
+ */
+LINPHONE_PUBLIC char * linphone_presence_person_get_id(const LinphonePresencePerson *person);
+
+/**
+ * Sets the id of a presence person.
+ * @param[in] person The #LinphonePresencePerson object for which to set the id.
+ * @param[in] id The id string to set. Can be NULL to generate it automatically.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_person_set_id(LinphonePresencePerson *person, const char *id);
+
+/**
+ * Gets the number of activities included in the presence person.
+ * @param[in] person The #LinphonePresencePerson object to get the number of activities from.
+ * @return The number of activities included in the #LinphonePresencePerson object.
+ */
+LINPHONE_PUBLIC unsigned int linphone_presence_person_get_nb_activities(const LinphonePresencePerson *person);
+
+/**
+ * Gets the nth activity of a presence person.
+ * @param[in] person The #LinphonePresencePerson object to get the activity from.
+ * @param[in] idx The index of the activity to get (the first activity having the index 0).
+ * @return A pointer to a #LinphonePresenceActivity object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresenceActivity * linphone_presence_person_get_nth_activity(const LinphonePresencePerson *person, unsigned int idx);
+
+/**
+ * Adds an activity to a presence person.
+ * @param[in] person The #LinphonePresencePerson object for which to add an activity.
+ * @param[in] activity The #LinphonePresenceActivity object to add to the person.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_person_add_activity(LinphonePresencePerson *person, LinphonePresenceActivity *activity);
+
+/**
+ * Clears the activities of a presence person.
+ * @param[in] person The #LinphonePresencePerson object for which to clear the activities.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_person_clear_activities(LinphonePresencePerson *person);
+
+/**
+ * Gets the number of notes included in the presence person.
+ * @param[in] person The #LinphonePresencePerson object to get the number of notes from.
+ * @return The number of notes included in the #LinphonePresencePerson object.
+ */
+LINPHONE_PUBLIC unsigned int linphone_presence_person_get_nb_notes(const LinphonePresencePerson *person);
+
+/**
+ * Gets the nth note of a presence person.
+ * @param[in] person The #LinphonePresencePerson object to get the note from.
+ * @param[in] idx The index of the note to get (the first note having the index 0).
+ * @return A pointer to a #LinphonePresenceNote object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresenceNote * linphone_presence_person_get_nth_note(const LinphonePresencePerson *person, unsigned int idx);
+
+/**
+ * Adds a note to a presence person.
+ * @param[in] person The #LinphonePresencePerson object for which to add a note.
+ * @param[in] note The #LinphonePresenceNote object to add to the person.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_person_add_note(LinphonePresencePerson *person, LinphonePresenceNote *note);
+
+/**
+ * Clears the notes of a presence person.
+ * @param[in] person The #LinphonePresencePerson object for which to clear the notes.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_person_clear_notes(LinphonePresencePerson *person);
+
+/**
+ * Gets the number of activities notes included in the presence person.
+ * @param[in] person The #LinphonePresencePerson object to get the number of activities notes from.
+ * @return The number of activities notes included in the #LinphonePresencePerson object.
+ */
+LINPHONE_PUBLIC unsigned int linphone_presence_person_get_nb_activities_notes(const LinphonePresencePerson *person);
+
+/**
+ * Gets the nth activities note of a presence person.
+ * @param[in] person The #LinphonePresencePerson object to get the activities note from.
+ * @param[in] idx The index of the activities note to get (the first note having the index 0).
+ * @return A pointer to a #LinphonePresenceNote object if successful, NULL otherwise.
+ */
+LINPHONE_PUBLIC LinphonePresenceNote * linphone_presence_person_get_nth_activities_note(const LinphonePresencePerson *person, unsigned int idx);
+
+/**
+ * Adds an activities note to a presence person.
+ * @param[in] person The #LinphonePresencePerson object for which to add an activities note.
+ * @param[in] note The #LinphonePresenceNote object to add to the person.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_person_add_activities_note(LinphonePresencePerson *person, LinphonePresenceNote *note);
+
+/**
+ * Clears the activities notes of a presence person.
+ * @param[in] person The #LinphonePresencePerson object for which to clear the activities notes.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_person_clear_activities_notes(LinphonePresencePerson *person);
+
+
+/*****************************************************************************
+ * PRESENCE ACTIVITY FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES          *
+ ****************************************************************************/
+
+/**
+ * Creates a presence activity.
+ * @param[in] acttype The #LinphonePresenceActivityType to set for the activity.
+ * @param[in] description An additional description of the activity to set for the activity. Can be NULL if no additional description is to be added.
+ * @return The created presence activity, NULL on error.
+ */
+LINPHONE_PUBLIC LinphonePresenceActivity * linphone_presence_activity_new(LinphonePresenceActivityType acttype, const char *description);
+
+/**
+ * Gets the string representation of a presence activity.
+ * @param[in] activity A pointer to the #LinphonePresenceActivity object for which to get a string representation.
+ * @return A pointer a dynamically allocated string representing the given activity.
+ *
+ * The returned string is to be freed by calling ms_free().
+ */
+LINPHONE_PUBLIC char * linphone_presence_activity_to_string(const LinphonePresenceActivity * activity);
+
+/**
+ * Gets the activity type of a presence activity.
+ * @param[in] activity A pointer to the #LinphonePresenceActivity for which to get the type.
+ * @return The #LinphonePresenceActivityType of the activity.
+ */
+LINPHONE_PUBLIC LinphonePresenceActivityType linphone_presence_activity_get_type(const LinphonePresenceActivity *activity);
+
+/**
+ * Sets the type of activity of a presence activity.
+ * @param[in] activity The #LinphonePresenceActivity for which to set for the activity type.
+ * @param[in] acttype The activity type to set for the activity.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_activity_set_type(LinphonePresenceActivity *activity, LinphonePresenceActivityType acttype);
+
+/**
+ * Gets the description of a presence activity.
+ * @param[in] activity A pointer to the #LinphonePresenceActivity for which to get the description.
+ * @return A pointer to the description string of the presence activity, or NULL if no description is specified.
+ */
+LINPHONE_PUBLIC const char * linphone_presence_activity_get_description(const LinphonePresenceActivity *activity);
+
+/**
+ * Sets the description of a presence activity.
+ * @param[in] activity The #LinphonePresenceActivity object for which to set the description.
+ * @param[in] description An additional description of the activity. Can be NULL if no additional description is to be added.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_activity_set_description(LinphonePresenceActivity *activity, const char *description);
+
+
+/*****************************************************************************
+ * PRESENCE NOTE FUNCTIONS TO GET ACCESS TO ALL FUNCTIONALITIES              *
+ ****************************************************************************/
+
+/**
+ * Creates a presence note.
+ * @param[in] content The content of the note to be created.
+ * @param[in] lang The language of the note to be created. Can be NULL if no language is to be specified for the note.
+ * @return The created presence note, NULL on error.
+ */
+LINPHONE_PUBLIC LinphonePresenceNote * linphone_presence_note_new(const char *content, const char *lang);
+
+/**
+ * Gets the content of a presence note.
+ * @param[in] note A pointer to the #LinphonePresenceNote for which to get the content.
+ * @return A pointer to the content of the presence note.
+ */
+LINPHONE_PUBLIC const char * linphone_presence_note_get_content(const LinphonePresenceNote *note);
+
+/**
+ * Sets the content of a presence note.
+ * @param[in] note The #LinphonePresenceNote object for which to set the content.
+ * @param[in] content The content of the note.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_note_set_content(LinphonePresenceNote *note, const char *content);
+
+/**
+ * Gets the language of a presence note.
+ * @param[in] note A pointer to the #LinphonePresenceNote for which to get the language.
+ * @return A pointer to the language string of the presence note, or NULL if no language is specified.
+ */
+LINPHONE_PUBLIC const char * linphone_presence_note_get_lang(const LinphonePresenceNote *note);
+
+/**
+ * Sets the language of a presence note.
+ * @param[in] note The #LinphonePresenceNote object for which to set the language.
+ * @param[in] lang The language of the note.
+ * @return 0 if successful, a value < 0 in case of error.
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_presence_note_set_lang(LinphonePresenceNote *note, const char *lang);
+
+
+/*****************************************************************************
+ * PRESENCE INTERNAL FUNCTIONS FOR WRAPPERS IN OTHER PROGRAMMING LANGUAGES   *
+ ****************************************************************************/
+
+/**
+ * Increase the reference count of the #LinphonePresenceModel object.
+ * @param[in] model The #LinphonePresenceModel object for which the reference count is to be increased.
+ * @return The #LinphonePresenceModel object with the increased reference count.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_presence_model_ref(LinphonePresenceModel *model);
+
+/**
+ * Decrease the reference count of the #LinphonePresenceModel object and destroy it if it reaches 0.
+ * @param[in] model The #LinphonePresenceModel object for which the reference count is to be decreased.
+ * @return The #LinphonePresenceModel object if the reference count is still positive, NULL if the object has been destroyed.
+ */
+LINPHONE_PUBLIC LinphonePresenceModel * linphone_presence_model_unref(LinphonePresenceModel *model);
+
+/**
+ * Sets the user data of a #LinphonePresenceModel object.
+ * @param[in] model The #LinphonePresenceModel object for which to set the user data.
+ * @param[in] user_data A pointer to the user data to set.
+ */
+LINPHONE_PUBLIC void linphone_presence_model_set_user_data(LinphonePresenceModel *model, void *user_data);
+
+/**
+ * Gets the user data of a #LinphonePresenceModel object.
+ * @param[in] model The #LinphonePresenceModel object for which to get the user data.
+ * @return A pointer to the user data.
+ */
+LINPHONE_PUBLIC void * linphone_presence_model_get_user_data(const LinphonePresenceModel *model);
+
+/**
+ * Gets the capabilities of a #LinphonePresenceModel object.
+ * @param[in] model The #LinphonePresenceModel object for which to set the contact.
+ * @return the capabilities.
+ */
+LINPHONE_PUBLIC int linphone_presence_model_get_capabilities(const LinphonePresenceModel *model);
+
+/**
+ * Returns whether or not the #LinphonePresenceModel object has a given capability.
+ * @param[in] model The #LinphonePresenceModel object for which to set the contact.
+ * @param[in] capability The capability to test.
+ * @return whether or not the #LinphonePresenceModel object has a given capability.
+ */
+LINPHONE_PUBLIC bool_t linphone_presence_model_has_capability(const LinphonePresenceModel *model, const LinphoneFriendCapability capability);
+
+/**
+ * Returns whether or not the #LinphonePresenceModel object has a given capability with a certain version.
+ * @param[in] model The #LinphonePresenceModel object for which to set the contact.
+ * @param[in] capability The capability to test.
+ * @param[in] version The wanted version to test.
+ * @return whether or not the #LinphonePresenceModel object has a given capability with a certain version.
+ */
+LINPHONE_PUBLIC bool_t linphone_presence_model_has_capability_with_version(
+	const LinphonePresenceModel *model,
+	const LinphoneFriendCapability capability,
+	float version
+);
+
+/**
+ * Returns whether or not the #LinphonePresenceModel object has a given capability with a certain version or more.
+ * @param[in] model The #LinphonePresenceModel object for which to set the contact.
+ * @param[in] capability The capability to test.
+ * @param[in] version The wanted version to test.
+ * @return whether or not the #LinphonePresenceModel object has a given capability with a certain version or more.
+ */
+LINPHONE_PUBLIC bool_t linphone_presence_model_has_capability_with_version_or_more(
+	const LinphonePresenceModel *model,
+	const LinphoneFriendCapability capability,
+	float version
+);
+
+/**
+ * Returns the version of the capability of a #LinphonePresenceModel.
+ * @param[in] model The #LinphonePresenceModel object for which to set the contact.
+ * @param[in] capability The capability to test.
+ * @return the version of the capability of a #LinphonePresenceModel or -1.0 if the model has not the capability.
+ */
+LINPHONE_PUBLIC float linphone_presence_model_get_capability_version(const LinphonePresenceModel *model, const LinphoneFriendCapability capability);
+
+/**
+ * Increase the reference count of the #LinphonePresenceService object.
+ * @param[in] service The #LinphonePresenceService object for which the reference count is to be increased.
+ * @return The #LinphonePresenceService object with the increased reference count.
+ */
+LINPHONE_PUBLIC LinphonePresenceService * linphone_presence_service_ref(LinphonePresenceService *service);
+
+/**
+ * Decrease the reference count of the #LinphonePresenceService object and destroy it if it reaches 0.
+ * @param[in] service The #LinphonePresenceService object for which the reference count is to be decreased.
+ * @return The #LinphonePresenceService object if the reference count is still positive, NULL if the object has been destroyed.
+ */
+LINPHONE_PUBLIC LinphonePresenceService * linphone_presence_service_unref(LinphonePresenceService *service);
+
+/**
+ * Sets the user data of a #LinphonePresenceService object.
+ * @param[in] service The #LinphonePresenceService object for which to set the user data.
+ * @param[in] user_data A pointer to the user data to set.
+ */
+LINPHONE_PUBLIC void linphone_presence_service_set_user_data(LinphonePresenceService *service, void *user_data);
+
+/**
+ * Gets the user data of a #LinphonePresenceService object.
+ * @param[in] service The #LinphonePresenceService object for which to get the user data.
+ * @return A pointer to the user data.
+ */
+LINPHONE_PUBLIC void * linphone_presence_service_get_user_data(const LinphonePresenceService *service);
+
+/**
+ * Increase the reference count of the #LinphonePresencePerson object.
+ * @param[in] person The #LinphonePresencePerson object for which the reference count is to be increased.
+ * @return The #LinphonePresencePerson object with the increased reference count.
+ */
+LINPHONE_PUBLIC LinphonePresencePerson * linphone_presence_person_ref(LinphonePresencePerson *person);
+
+/**
+ * Decrease the reference count of the #LinphonePresencePerson object and destroy it if it reaches 0.
+ * @param[in] person The #LinphonePresencePerson object for which the reference count is to be decreased.
+ * @return The #LinphonePresencePerson object if the reference count is still positive, NULL if the object has been destroyed.
+ */
+LINPHONE_PUBLIC LinphonePresencePerson * linphone_presence_person_unref(LinphonePresencePerson *person);
+
+/**
+ * Sets the user data of a #LinphonePresencePerson object.
+ * @param[in] person The #LinphonePresencePerson object for which to set the user data.
+ * @param[in] user_data A pointer to the user data to set.
+ */
+LINPHONE_PUBLIC void linphone_presence_person_set_user_data(LinphonePresencePerson *person, void *user_data);
+
+/**
+ * Gets the user data of a #LinphonePresencePerson object.
+ * @param[in] person The #LinphonePresencePerson object for which to get the user data.
+ * @return A pointer to the user data.
+ */
+LINPHONE_PUBLIC void * linphone_presence_person_get_user_data(const LinphonePresencePerson *person);
+
+/**
+ * Increase the reference count of the #LinphonePresenceActivity object.
+ * @param[in] activity The #LinphonePresenceActivity object for which the reference count is to be increased.
+ * @return The #LinphonePresenceActivity object with the increased reference count.
+ */
+LINPHONE_PUBLIC LinphonePresenceActivity * linphone_presence_activity_ref(LinphonePresenceActivity *activity);
+
+/**
+ * Decrease the reference count of the #LinphonePresenceActivity object and destroy it if it reaches 0.
+ * @param[in] activity The #LinphonePresenceActivity object for which the reference count is to be decreased.
+ * @return The #LinphonePresenceActivity object if the reference count is still positive, NULL if the object has been destroyed.
+ */
+LINPHONE_PUBLIC LinphonePresenceActivity * linphone_presence_activity_unref(LinphonePresenceActivity *activity);
+
+/**
+ * Sets the user data of a #LinphonePresenceActivity object.
+ * @param[in] activity The #LinphonePresenceActivity object for which to set the user data.
+ * @param[in] user_data A pointer to the user data to set.
+ */
+LINPHONE_PUBLIC void linphone_presence_activity_set_user_data(LinphonePresenceActivity *activity, void *user_data);
+
+/**
+ * Gets the user data of a #LinphonePresenceActivity object.
+ * @param[in] activity The #LinphonePresenceActivity object for which to get the user data.
+ * @return A pointer to the user data.
+ */
+LINPHONE_PUBLIC void * linphone_presence_activity_get_user_data(const LinphonePresenceActivity *activity);
+
+/**
+ * Increase the reference count of the #LinphonePresenceNote object.
+ * @param[in] note The #LinphonePresenceNote object for which the reference count is to be increased.
+ * @return The #LinphonePresenceNote object with the increased reference count.
+ */
+LINPHONE_PUBLIC LinphonePresenceNote * linphone_presence_note_ref(LinphonePresenceNote *note);
+
+/**
+ * Decrease the reference count of the #LinphonePresenceNote object and destroy it if it reaches 0.
+ * @param[in] note The #LinphonePresenceNote object for which the reference count is to be decreased.
+ * @return The #LinphonePresenceNote object if the reference count is still positive, NULL if the object has been destroyed.
+ */
+LINPHONE_PUBLIC LinphonePresenceNote * linphone_presence_note_unref(LinphonePresenceNote *note);
+
+/**
+ * Sets the user data of a #LinphonePresenceNote object.
+ * @param[in] note The #LinphonePresenceNote object for which to set the user data.
+ * @param[in] user_data A pointer to the user data to set.
+ */
+LINPHONE_PUBLIC void linphone_presence_note_set_user_data(LinphonePresenceNote *note, void *user_data);
+
+/**
+ * Gets the user data of a #LinphonePresenceNote object.
+ * @param[in] note The #LinphonePresenceNote object for which to get the user data.
+ * @return A pointer to the user data.
+ */
+LINPHONE_PUBLIC void * linphone_presence_note_get_user_data(const LinphonePresenceNote *note);
+
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONEPRESENCE_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/proxy_config.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/proxy_config.h"
new file mode 100644
index 0000000..c9da4ff
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/proxy_config.h"
@@ -0,0 +1,694 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_PROXY_CONFIG_H
+#define LINPHONE_PROXY_CONFIG_H
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup proxies
+ * @{
+**/
+
+/**
+ * Creates an empty proxy config.
+ * @deprecated, use #linphone_core_create_proxy_config instead
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneProxyConfig *linphone_proxy_config_new(void);
+
+/**
+ * Acquire a reference to the proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The same proxy config.
+**/
+LINPHONE_PUBLIC LinphoneProxyConfig *linphone_proxy_config_ref(LinphoneProxyConfig *cfg);
+
+/**
+ * Release reference to the proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_unref(LinphoneProxyConfig *cfg);
+
+/**
+ * Retrieve the user pointer associated with the proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The user pointer associated with the proxy config.
+**/
+LINPHONE_PUBLIC void *linphone_proxy_config_get_user_data(const LinphoneProxyConfig *cfg);
+
+/**
+ * Assign a user pointer to the proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] ud The user pointer to associate with the proxy config.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_user_data(LinphoneProxyConfig *cfg, void *ud);
+
+/**
+ * Sets the proxy address
+ *
+ * Examples of valid sip proxy address are:
+ * - IP address: sip:87.98.157.38
+ * - IP address with port: sip:87.98.157.38:5062
+ * - hostnames : sip:sip.example.net
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_proxy_config_set_server_addr(LinphoneProxyConfig *cfg, const char *server_addr);
+
+/**
+ * @deprecated Use linphone_proxy_config_set_identity_address()
+ * @donotwrap
+**/
+LINPHONE_PUBLIC	LINPHONE_DEPRECATED LinphoneStatus linphone_proxy_config_set_identity(LinphoneProxyConfig *cfg, const char *identity);
+
+/**
+ * Sets the user identity as a SIP address.
+ *
+ * This identity is normally formed with display name, username and domain, such
+ * as:
+ * Alice <sip:alice@example.net>
+ * The REGISTER messages will have from and to set to this identity.
+ *
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_proxy_config_set_identity_address(LinphoneProxyConfig *cfg, const LinphoneAddress *identity);
+
+/**
+ * Sets a SIP route.
+ * When a route is set, all outgoing calls will go to the route's destination if this proxy
+ * is the default one (see linphone_core_set_default_proxy() ).
+ * @return -1 if route is invalid, 0 otherwise.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_proxy_config_set_route(LinphoneProxyConfig *cfg, const char *route);
+
+/**
+ * Sets a list of SIP route.
+ * When a route is set, all outgoing calls will go to the route's destination if this proxy
+ * is the default one (see linphone_core_set_default_proxy() ).
+ * @param[in] cfg the #LinphoneProxyConfig
+ * @param[in] routes A \bctbx_list{const char *} of routes
+ * @return -1 if routes are invalid, 0 otherwise.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_proxy_config_set_routes(LinphoneProxyConfig *cfg, const bctbx_list_t *routes);
+
+/**
+ * Sets the registration expiration time in seconds.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_expires(LinphoneProxyConfig *cfg, int expires);
+
+#define linphone_proxy_config_expires linphone_proxy_config_set_expires
+
+/**
+ * @brief Indicates  either or not, REGISTRATION must be issued for this #LinphoneProxyConfig.
+ *
+ * In case this #LinphoneProxyConfig has been added to #LinphoneCore, follows the linphone_proxy_config_edit() rule.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param val if true, registration will be engaged
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_enable_register(LinphoneProxyConfig *cfg, bool_t val);
+
+#define linphone_proxy_config_enableregister linphone_proxy_config_enable_register
+
+/**
+ * Starts editing a proxy configuration.
+ *
+ * Because proxy configuration must be consistent, applications MUST
+ * call linphone_proxy_config_edit() before doing any attempts to modify
+ * proxy configuration (such as identity, proxy address and so on).
+ * Once the modifications are done, then the application must call
+ * linphone_proxy_config_done() to commit the changes.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_edit(LinphoneProxyConfig *cfg);
+
+/**
+ * Commits modification made to the proxy configuration.
+**/
+LINPHONE_PUBLIC LinphoneStatus linphone_proxy_config_done(LinphoneProxyConfig *cfg);
+
+/**
+ * @brief Indicates either or not, PUBLISH must be issued for this #LinphoneProxyConfig.
+ *
+ * In case this #LinphoneProxyConfig has been added to #LinphoneCore, follows the #linphone_proxy_config_edit() rule.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param val if TRUE, publish will be engaged
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_enable_publish(LinphoneProxyConfig *cfg, bool_t val);
+
+/**
+ * Set the publish expiration time in second.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param expires in second
+ * */
+LINPHONE_PUBLIC void linphone_proxy_config_set_publish_expires(LinphoneProxyConfig *cfg, int expires);
+
+/**
+ * get the publish expiration time in second. Default value is the registration expiration value.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return expires in second
+ * */
+LINPHONE_PUBLIC int linphone_proxy_config_get_publish_expires(const LinphoneProxyConfig *cfg);
+
+/**
+ * Sets whether liblinphone should replace "+" by international calling prefix in dialed numbers (passed to
+ * #linphone_core_invite ).
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_dial_escape_plus(LinphoneProxyConfig *cfg, bool_t val);
+
+/**
+ * Sets a dialing prefix to be automatically prepended when inviting a number with
+ * linphone_core_invite();
+ * This dialing prefix shall usually be the country code of the country where the user is living, without "+".
+ *
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_dial_prefix(LinphoneProxyConfig *cfg, const char *prefix);
+
+ /**
+ * Indicates whether quality statistics during call should be stored and sent to a collector according to RFC 6035.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] enable True to store quality statistics and send them to the collector, false to disable it.
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_enable_quality_reporting(LinphoneProxyConfig *cfg, bool_t enable);
+
+/**
+ * Indicates whether quality statistics during call should be stored and sent to a collector according to RFC 6035.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return True if quality repotring is enabled, false otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_proxy_config_quality_reporting_enabled(LinphoneProxyConfig *cfg);
+
+ /**
+ * Set the route of the collector end-point when using quality reporting. This SIP address
+ * should be used on server-side to process packets directly before discarding packets. Collector address
+ * should be a non existing account and will not receive any messages.
+ * If NULL, reports will be send to the proxy domain.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] collector route of the collector end-point, if NULL PUBLISH will be sent to the proxy domain.
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_set_quality_reporting_collector(LinphoneProxyConfig *cfg, const char *collector);
+
+ /**
+ * Get the route of the collector end-point when using quality reporting. This SIP address
+ * should be used on server-side to process packets directly before discarding packets. Collector address
+ * should be a non existing account and will not receive any messages.
+ * If NULL, reports will be send to the proxy domain.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The SIP address of the collector end-point.
+ */
+LINPHONE_PUBLIC const char *linphone_proxy_config_get_quality_reporting_collector(const LinphoneProxyConfig *cfg);
+
+/**
+ * Set the interval between 2 interval reports sending when using quality reporting. If call exceed interval size, an
+ * interval report will be sent to the collector. On call termination, a session report will be sent
+ * for the remaining period. Value must be 0 (disabled) or positive.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] interval The interval in seconds, 0 means interval reports are disabled.
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_set_quality_reporting_interval(LinphoneProxyConfig *cfg, int interval);
+
+/**
+ * Get the interval between interval reports when using quality reporting.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The interval in seconds, 0 means interval reports are disabled.
+ */
+
+LINPHONE_PUBLIC int linphone_proxy_config_get_quality_reporting_interval(LinphoneProxyConfig *cfg);
+
+/**
+ * Get the registration state of the given proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The registration state of the proxy config.
+**/
+LINPHONE_PUBLIC LinphoneRegistrationState linphone_proxy_config_get_state(const LinphoneProxyConfig *cfg);
+
+/**
+ * @return a boolean indicating that the user is sucessfully registered on the proxy.
+ * @deprecated Use linphone_proxy_config_get_state() instead.
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_proxy_config_is_registered(const LinphoneProxyConfig *cfg);
+
+/**
+ * Get the domain name of the given proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The domain name of the proxy config.
+**/
+LINPHONE_PUBLIC const char *linphone_proxy_config_get_domain(const LinphoneProxyConfig *cfg);
+
+/**
+ * Get the realm of the given proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The realm of the proxy config.
+**/
+LINPHONE_PUBLIC const char *linphone_proxy_config_get_realm(const LinphoneProxyConfig *cfg);
+
+/**
+ * Set the realm of the given proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] realm New realm value.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_realm(LinphoneProxyConfig *cfg, const char * realm);
+
+/**
+ * @return the route set for this proxy configuration.
+ * @deprecated Use linphone_proxy_config_get_routes() instead.
+**/
+LINPHONE_PUBLIC const char *linphone_proxy_config_get_route(const LinphoneProxyConfig *cfg);
+
+/**
+ * Gets the list of the routes set for this proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return \bctbx_list{const char *} the list of routes.
+ */
+LINPHONE_PUBLIC const bctbx_list_t* linphone_proxy_config_get_routes(const LinphoneProxyConfig *cfg);
+
+/**
+ * @return the SIP identity that belongs to this proxy configuration.
+**/
+LINPHONE_PUBLIC const LinphoneAddress *linphone_proxy_config_get_identity_address(const LinphoneProxyConfig *cfg);
+
+/**
+ * @deprecated use linphone_proxy_config_get_identity_address()
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED const char *linphone_proxy_config_get_identity(const LinphoneProxyConfig *cfg);
+
+/**
+ * @return TRUE if PUBLISH request is enabled for this proxy.
+**/
+LINPHONE_PUBLIC bool_t linphone_proxy_config_publish_enabled(const LinphoneProxyConfig *cfg);
+
+/**
+ * @return the proxy's SIP address.
+**/
+LINPHONE_PUBLIC	const char *linphone_proxy_config_get_server_addr(const LinphoneProxyConfig *cfg);
+
+#define linphone_proxy_config_get_addr linphone_proxy_config_get_server_addr
+
+/**
+ * @return the duration of registration.
+**/
+LINPHONE_PUBLIC int linphone_proxy_config_get_expires(const LinphoneProxyConfig *cfg);
+
+/**
+ * @return TRUE if registration to the proxy is enabled.
+**/
+LINPHONE_PUBLIC bool_t linphone_proxy_config_register_enabled(const LinphoneProxyConfig *cfg);
+
+/**
+ * Refresh a proxy registration.
+ * This is useful if for example you resuming from suspend, thus IP address may have changed.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_refresh_register(LinphoneProxyConfig *cfg);
+
+/**
+ * Prevent a proxy config from refreshing its registration.
+ * This is useful to let registrations to expire naturally (or) when the application wants to keep control on when
+ * refreshes are sent.
+ * However, linphone_core_set_network_reachable(lc,TRUE) will always request the proxy configs to refresh their registrations.
+ * The refreshing operations can be resumed with linphone_proxy_config_refresh_register().
+ * @param[in] cfg #LinphoneProxyConfig object.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_pause_register(LinphoneProxyConfig *cfg);
+
+/**
+ * Return the contact address of the proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return a #LinphoneAddress correspong to the contact address of the proxy config.
+**/
+LINPHONE_PUBLIC const LinphoneAddress* linphone_proxy_config_get_contact(const LinphoneProxyConfig *cfg);
+
+/**
+ * @return previously set contact parameters.
+**/
+LINPHONE_PUBLIC const char *linphone_proxy_config_get_contact_parameters(const LinphoneProxyConfig *cfg);
+
+/**
+ * Set optional contact parameters that will be added to the contact information sent in the registration.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param contact_params a string contaning the additional parameters in text form, like "myparam=something;myparam2=something_else"
+ *
+ * The main use case for this function is provide the proxy additional information regarding the user agent, like for example unique identifier or apple push id.
+ * As an example, the contact address in the SIP register sent will look like <sip:joe@15.128.128.93:50421>;apple-push-id=43143-DFE23F-2323-FA2232.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_contact_parameters(LinphoneProxyConfig *cfg, const char *contact_params);
+
+/**
+ * Set optional contact parameters that will be added to the contact information sent in the registration, inside the URI.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param contact_uri_params a string containing the additional parameters in text form, like "myparam=something;myparam2=something_else"
+ *
+ * The main use case for this function is provide the proxy additional information regarding the user agent, like for example unique identifier or apple push id.
+ * As an example, the contact address in the SIP register sent will look like <sip:joe@15.128.128.93:50421;apple-push-id=43143-DFE23F-2323-FA2232>.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_contact_uri_parameters(LinphoneProxyConfig *cfg, const char *contact_uri_params);
+
+/**
+ * @return previously set contact URI parameters.
+**/
+LINPHONE_PUBLIC const char* linphone_proxy_config_get_contact_uri_parameters(const LinphoneProxyConfig *cfg);
+
+/**
+ * Get the #LinphoneCore object to which is associated the #LinphoneProxyConfig.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The #LinphoneCore object to which is associated the #LinphoneProxyConfig.
+**/
+LINPHONE_PUBLIC LinphoneCore * linphone_proxy_config_get_core(const LinphoneProxyConfig *cfg);
+
+/**
+ * @return whether liblinphone should replace "+" by "00" in dialed numbers (passed to
+ * #linphone_core_invite ).
+ *
+**/
+LINPHONE_PUBLIC bool_t linphone_proxy_config_get_dial_escape_plus(const LinphoneProxyConfig *cfg);
+
+/**
+ * @return dialing prefix.
+**/
+LINPHONE_PUBLIC	const char * linphone_proxy_config_get_dial_prefix(const LinphoneProxyConfig *cfg);
+
+/**
+ * Get the reason why registration failed when the proxy config state is LinphoneRegistrationFailed.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The reason why registration failed for this proxy config.
+**/
+LINPHONE_PUBLIC LinphoneReason linphone_proxy_config_get_error(const LinphoneProxyConfig *cfg);
+
+/**
+ * Get detailed information why registration failed when the proxy config state is LinphoneRegistrationFailed.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The details why registration failed for this proxy config.
+**/
+LINPHONE_PUBLIC const LinphoneErrorInfo *linphone_proxy_config_get_error_info(const LinphoneProxyConfig *cfg);
+
+/**
+ * Get the transport from either service route, route or addr.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The transport as a string (I.E udp, tcp, tls, dtls)
+**/
+LINPHONE_PUBLIC const char* linphone_proxy_config_get_transport(const LinphoneProxyConfig *cfg);
+
+/**
+ * Destroys a proxy config.
+ * @note: #LinphoneProxyConfig that have been removed from #LinphoneCore with
+ * linphone_core_remove_proxy_config() must not be freed.
+ * @deprecated
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_proxy_config_destroy(LinphoneProxyConfig *cfg);
+
+LINPHONE_PUBLIC void linphone_proxy_config_set_sip_setup(LinphoneProxyConfig *cfg, const char *type);
+
+LINPHONE_PUBLIC SipSetupContext *linphone_proxy_config_get_sip_setup_context(LinphoneProxyConfig *cfg);
+
+LINPHONE_PUBLIC SipSetup *linphone_proxy_config_get_sip_setup(LinphoneProxyConfig *cfg);
+
+/**
+ * Detect if the given input is a phone number or not.
+ * @param proxy #LinphoneProxyConfig argument, unused yet but may contain useful data. Can be NULL.
+ * @param username string to parse.
+ * @return TRUE if input is a phone number, FALSE otherwise.
+**/
+LINPHONE_PUBLIC bool_t linphone_proxy_config_is_phone_number(LinphoneProxyConfig *proxy, const char *username);
+
+/**
+ * See linphone_proxy_config_normalize_phone_number
+ * @param proxy #LinphoneProxyConfig object containing country code and/or escape symbol. If NULL passed, will use default configuration.
+ * @param username the string to parse
+ * @param result the newly normalized number
+ * @param result_len the size of the normalized number \a result
+ * @return TRUE if a phone number was recognized, FALSE otherwise.
+ * @deprecated use linphone_proxy_config_normalize_phone_number()
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_proxy_config_normalize_number(LinphoneProxyConfig *proxy, const char *username, char *result, size_t result_len);
+
+/**
+ * Normalize a human readable phone number into a basic string. 888-444-222 becomes 888444222
+ * or +33888444222 depending on the #LinphoneProxyConfig object.
+ * This function will always generate a normalized username if input is a phone number.
+ * @param proxy #LinphoneProxyConfig object containing country code and/or escape symbol. If NULL passed, will use default configuration.
+ * @param username the string to parse
+ * @return NULL if input is an invalid phone number, normalized phone number from username input otherwise.
+*/
+LINPHONE_PUBLIC char* linphone_proxy_config_normalize_phone_number(LinphoneProxyConfig *proxy, const char *username);
+
+/**
+ * Normalize a human readable sip uri into a fully qualified LinphoneAddress.
+ * A sip address should look like DisplayName \<sip:username\@domain:port\> .
+ * Basically this function performs the following tasks
+ * - if a phone number is entered, prepend country prefix and eventually escape the '+' by 00 of the proxy config.
+ * - if no domain part is supplied, append the domain name of the proxy config. Returns NULL if no proxy is provided at this point.
+ * - if no sip: is present, prepend it.
+ *
+ * The result is a syntactically correct SIP address.
+ * @param proxy #LinphoneProxyConfig object containing country code, escape symbol and/or domain name. Can be NULL if domain is already provided.
+ * @param username the string to parse
+ * @return NULL if invalid input, normalized sip address otherwise.
+*/
+LINPHONE_PUBLIC LinphoneAddress* linphone_proxy_config_normalize_sip_uri(LinphoneProxyConfig *proxy, const char *username);
+
+/**
+ * Set default privacy policy for all calls routed through this proxy.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param privacy #LinphonePrivacy to configure privacy
+ * */
+LINPHONE_PUBLIC void linphone_proxy_config_set_privacy(LinphoneProxyConfig *cfg, LinphonePrivacyMask privacy);
+
+/**
+ * Get default privacy policy for all calls routed through this proxy.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return Privacy mode
+ * */
+LINPHONE_PUBLIC LinphonePrivacyMask linphone_proxy_config_get_privacy(const LinphoneProxyConfig *cfg);
+
+/**
+ * Set the http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param server_url URL of the file server like https://file.linphone.org/upload.php
+ * @warning That function isn't implemented yet.
+ * @donotwrap
+ * */
+LINPHONE_PUBLIC void linphone_proxy_config_set_file_transfer_server(LinphoneProxyConfig *cfg, const char * server_url);
+
+/**
+ * Get the http file transfer server to be used for content type application/vnd.gsma.rcs-ft-http+xml
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return URL of the file server like https://file.linphone.org/upload.php
+ * @warning That function isn't implemented yet.
+ * @donotwrap
+ * */
+LINPHONE_PUBLIC const char* linphone_proxy_config_get_file_transfer_server(const LinphoneProxyConfig *cfg);
+
+/**
+ * Indicates whether AVPF/SAVPF must be used for calls using this proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] enable True to enable AVPF/SAVF, false to disable it.
+ * @deprecated use linphone_proxy_config_set_avpf_mode()
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_proxy_config_enable_avpf(LinphoneProxyConfig *cfg, bool_t enable);
+
+/**
+ * Indicates whether AVPF/SAVPF is being used for calls using this proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return True if AVPF/SAVPF is enabled, false otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_proxy_config_avpf_enabled(LinphoneProxyConfig *cfg);
+
+/**
+ * Set the interval between regular RTCP reports when using AVPF/SAVPF.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] interval The interval in seconds (between 0 and 5 seconds).
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_set_avpf_rr_interval(LinphoneProxyConfig *cfg, uint8_t interval);
+
+/**
+ * Get the interval between regular RTCP reports when using AVPF/SAVPF.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The interval in seconds.
+ */
+LINPHONE_PUBLIC uint8_t linphone_proxy_config_get_avpf_rr_interval(const LinphoneProxyConfig *cfg);
+
+/**
+ * Get enablement status of RTCP feedback (also known as AVPF profile).
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return the enablement mode, which can be #LinphoneAVPFDefault (use LinphoneCore's mode), #LinphoneAVPFEnabled (avpf is enabled), or #LinphoneAVPFDisabled (disabled).
+**/
+LINPHONE_PUBLIC LinphoneAVPFMode linphone_proxy_config_get_avpf_mode(const LinphoneProxyConfig *cfg);
+
+/**
+ * Enable the use of RTCP feedback (also known as AVPF profile).
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] mode the enablement mode, which can be #LinphoneAVPFDefault (use LinphoneCore's mode), #LinphoneAVPFEnabled (avpf is enabled), or #LinphoneAVPFDisabled (disabled).
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_avpf_mode(LinphoneProxyConfig *cfg, LinphoneAVPFMode mode);
+
+/**
+ * Obtain the value of a header sent by the server in last answer to REGISTER.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param header_name the header name for which to fetch corresponding value
+ * @return the value of the queried header.
+**/
+LINPHONE_PUBLIC const char *linphone_proxy_config_get_custom_header(LinphoneProxyConfig *cfg, const char *header_name);
+
+/**
+ * Set the value of a custom header sent to the server in REGISTERs request.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param header_name the header name
+ * @param header_value the header's value
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_custom_header(LinphoneProxyConfig *cfg, const char *header_name, const char *header_value);
+
+/**
+ * Find authentication info matching proxy config, if any, similarly to linphone_core_find_auth_info.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return a #LinphoneAuthInfo matching proxy config criteria if possible, NULL if nothing can be found.
+**/
+LINPHONE_PUBLIC const LinphoneAuthInfo* linphone_proxy_config_find_auth_info(const LinphoneProxyConfig *cfg);
+
+/**
+ * Get the persistent reference key associated to the proxy config.
+ *
+ * The reference key can be for example an id to an external database.
+ * It is stored in the config file, thus can survive to process exits/restarts.
+ *
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The reference key string that has been associated to the proxy config, or NULL if none has been associated.
+**/
+LINPHONE_PUBLIC const char * linphone_proxy_config_get_ref_key(const LinphoneProxyConfig *cfg);
+
+/**
+ * Associate a persistent reference key to the proxy config.
+ *
+ * The reference key can be for example an id to an external database.
+ * It is stored in the config file, thus can survive to process exits/restarts.
+ *
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] refkey The reference key string to associate to the proxy config.
+**/
+LINPHONE_PUBLIC void linphone_proxy_config_set_ref_key(LinphoneProxyConfig *cfg, const char *refkey);
+
+/**
+ * Get the dependency of a #LinphoneProxyConfig.
+ *
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The proxy config this one is dependent upon, or NULL if not marked dependent
+ **/
+LINPHONE_PUBLIC LinphoneProxyConfig *linphone_proxy_config_get_dependency(LinphoneProxyConfig *cfg);
+
+/**
+ * Mark	this proxy configuration as being dependent on the given one.
+ * The dependency must refer to a proxy config previously added to the core and which idkey property is defined.
+ *
+ * @see linphone_proxy_config_set_idkey()
+ *
+ * The proxy configuration marked as dependent will wait for successful registration on its dependency before triggering its own.
+ *
+ * Once registered, both proxy configurations will share the same contact address (the 'dependency' one).
+ *
+ * This mecanism must be enabled before the proxy configuration is added to the core
+ *
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] depends_on The reference key of a master #LinphoneProxyConfig
+ **/
+LINPHONE_PUBLIC void linphone_proxy_config_set_dependency(LinphoneProxyConfig *cfg, LinphoneProxyConfig *dependency);
+
+/**
+ * Get the idkey property of a #LinphoneProxyConfig.
+ *
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The idkey string, or NULL
+ **/
+LINPHONE_PUBLIC const char *linphone_proxy_config_get_idkey(LinphoneProxyConfig *cfg);
+
+/**
+ * Set the idkey property on the given proxy configuration.
+ * This property can the be referenced by another proxy config 'depends_on' to create a dependency relation between them.
+ * @see linphone_proxy_config_set_depends_on()
+ *
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] idkey The idkey string to associate to the given #LinphoneProxyConfig
+ **/
+LINPHONE_PUBLIC void linphone_proxy_config_set_idkey(LinphoneProxyConfig *cfg, const char *idkey);
+
+/**
+ * Get The policy that is used to pass through NATs/firewalls when using this proxy config.
+ * If it is set to NULL, the default NAT policy from the core will be used instead.
+ * @param[in] cfg #LinphoneProxyConfig object
+ * @return #LinphoneNatPolicy object in use.
+ * @see linphone_core_get_nat_policy()
+ */
+LINPHONE_PUBLIC LinphoneNatPolicy * linphone_proxy_config_get_nat_policy(const LinphoneProxyConfig *cfg);
+
+/**
+ * Set the policy to use to pass through NATs/firewalls when using this proxy config.
+ * If it is set to NULL, the default NAT policy from the core will be used instead.
+ * @param[in] cfg #LinphoneProxyConfig object
+ * @param[in] policy #LinphoneNatPolicy object
+ * @see linphone_core_set_nat_policy()
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_set_nat_policy(LinphoneProxyConfig *cfg, LinphoneNatPolicy *policy);
+
+/**
+ * Set the conference factory uri.
+ * @param[in] cfg A #LinphoneProxyConfig object
+ * @param[in] uri The uri of the conference factory
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_set_conference_factory_uri(LinphoneProxyConfig *cfg, const char *uri);
+
+/**
+ * Get the conference factory uri.
+ * @param[in] cfg A #LinphoneProxyConfig object
+ * @return The uri of the conference factory
+ */
+LINPHONE_PUBLIC const char * linphone_proxy_config_get_conference_factory_uri(const LinphoneProxyConfig *cfg);
+
+/**
+ * Indicates whether to add to the contact parameters the push notification information.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @param[in] allow True to allow push notification information, false otherwise.
+ */
+LINPHONE_PUBLIC void linphone_proxy_config_set_push_notification_allowed(LinphoneProxyConfig *cfg, bool_t allow);
+
+/**
+ * Indicates whether to add to the contact parameters the push notification information.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return True if push notification informations should be added, false otherwise.
+ */
+LINPHONE_PUBLIC bool_t linphone_proxy_config_is_push_notification_allowed(const LinphoneProxyConfig *cfg);
+
+/**
+ * Return the unread chat message count for a given proxy config.
+ * @param[in] cfg #LinphoneProxyConfig object.
+ * @return The unread chat message count.
+ */
+LINPHONE_PUBLIC int linphone_proxy_config_get_unread_chat_message_count (const LinphoneProxyConfig *cfg);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/ringtoneplayer.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/ringtoneplayer.h"
new file mode 100644
index 0000000..0bbf534
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/ringtoneplayer.h"
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_RINGTONEPLAYER_H
+#define LINPHONE_RINGTONEPLAYER_H
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*LinphoneRingtonePlayerFunc)(LinphoneRingtonePlayer* rp, void* user_data, int status);
+
+LINPHONE_PUBLIC LinphoneRingtonePlayer* linphone_ringtoneplayer_new(void);
+LINPHONE_PUBLIC void linphone_ringtoneplayer_destroy(LinphoneRingtonePlayer* rp);
+
+LINPHONE_PUBLIC LinphoneStatus linphone_ringtoneplayer_start(MSFactory *factory, LinphoneRingtonePlayer* rp, MSSndCard* card, const char* ringtone, int loop_pause_ms);
+/**
+ * Start a ringtone player
+ * @param factory A MSFactory object
+ * @param rp #LinphoneRingtonePlayer object
+ * @param card unused argument
+ * @param ringtone path to the ringtone to play
+ * @param loop_pause_ms pause interval in milliseconds to be observed between end of play and resuming at start. A value of -1 disables loop mode
+ * @param end_of_ringtone A callback function called when the ringtone ends
+ * @param user_data A user data passed to the callback function called when the ringtone ends
+ * @return 0 if the player successfully started, positive error code otherwise
+ */
+LINPHONE_PUBLIC LinphoneStatus linphone_ringtoneplayer_start_with_cb(MSFactory *factory, LinphoneRingtonePlayer* rp, MSSndCard* card,
+														  const char* ringtone, int loop_pause_ms, LinphoneRingtonePlayerFunc end_of_ringtone, void * user_data);
+LINPHONE_PUBLIC bool_t linphone_ringtoneplayer_is_started(LinphoneRingtonePlayer* rp);
+LINPHONE_PUBLIC LinphoneStatus linphone_ringtoneplayer_stop(LinphoneRingtonePlayer* rp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_RINGTONEPLAYER_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/sipsetup.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/sipsetup.h"
new file mode 100644
index 0000000..94e036e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/sipsetup.h"
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef sipsetup_h
+#define sipsetup_h
+
+#include "mediastreamer2/mscommon.h"
+
+struct _SipSetup;
+
+struct _BuddyInfo;
+
+struct _LinphoneXmlRpcSession;
+
+
+struct _SipSetupContext{
+	struct _SipSetup *funcs;
+	struct _LinphoneProxyConfig *cfg;
+	struct _LinphoneXmlRpcSession *xmlrpc_session;
+	char domain[128];
+	char username[128];
+	void *data;
+};
+
+typedef struct _SipSetupContext SipSetupContext;
+
+#define SIP_SETUP_CAP_PROXY_PROVIDER	(1)
+#define SIP_SETUP_CAP_STUN_PROVIDER	(1<<1)
+#define SIP_SETUP_CAP_RELAY_PROVIDER	(1<<2)
+#define SIP_SETUP_CAP_BUDDY_LOOKUP	(1<<3)
+#define SIP_SETUP_CAP_ACCOUNT_MANAGER	(1<<4)  /*can create accounts*/
+#define SIP_SETUP_CAP_LOGIN		(1<<5)  /*can login to any account for a given proxy */
+
+typedef enum _BuddyLookupStatus{
+	BuddyLookupNone,
+	BuddyLookupConnecting,
+	BuddyLookupConnected,
+	BuddyLookupReceivingResponse,
+	BuddyLookupDone,
+	BuddyLookupFailure
+}BuddyLookupStatus;
+
+typedef struct _BuddyAddress{
+	char street[64];
+	char zip[64];
+	char town[64];
+	char country[64];
+} BuddyAddress;
+
+typedef struct _BuddyInfo{
+	char firstname[64];
+	char lastname[64];
+	char displayname[64];
+	char sip_uri[128];
+	char email[128];
+	BuddyAddress address;
+	char image_type[32];
+	uint8_t *image_data;
+	int image_length;
+}BuddyInfo;
+
+typedef struct _BuddyLookupRequest {
+	char *key;
+	int max_results;
+	BuddyLookupStatus status;
+	MSList *results; /*of BuddyInfo */
+}BuddyLookupRequest;
+
+
+typedef struct _BuddyLookupFuncs{
+	BuddyLookupRequest * (*request_create)(SipSetupContext *ctx);
+	int (*request_submit)(SipSetupContext *ctx, BuddyLookupRequest *req);
+	int (*request_free)(SipSetupContext *ctx, BuddyLookupRequest *req);
+}BuddyLookupFuncs;
+
+
+struct _SipSetup{
+	const char *name;
+	unsigned int capabilities;
+	int initialized;
+	bool_t (*init)(void);
+	void (*exit)(void);
+	void (*init_instance)(SipSetupContext *ctx);
+	void (*uninit_instance)(SipSetupContext *ctx);
+	int (*account_exists)(SipSetupContext *ctx, const char *uri);
+	int (*create_account)(SipSetupContext *ctx, const char *uri, const char *passwd, const char *email, int suscribe);
+	int (*login_account)(SipSetupContext *ctx, const char *uri, const char *passwd, const char *userid);
+	int (*get_proxy)(SipSetupContext *ctx, const char *domain, char *proxy, size_t sz);
+	int (*get_stun_servers)(SipSetupContext *ctx, char *stun1, char *stun2, size_t size);
+	int (*get_relay)(SipSetupContext *ctx, char *relay, size_t size);
+	const char * (*get_notice)(SipSetupContext *ctx);
+	const char ** (*get_domains)(SipSetupContext *ctx);
+	int (*logout_account)(SipSetupContext *ctx);
+	BuddyLookupFuncs *buddy_lookup_funcs;
+	int (*account_validated)(SipSetupContext *ctx, const char *uri);
+};
+
+typedef struct _SipSetup SipSetup;
+
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+BuddyInfo *buddy_info_new(void);
+void buddy_info_free(BuddyInfo *info);
+
+LINPHONE_PUBLIC void buddy_lookup_request_set_key(BuddyLookupRequest *req, const char *key);
+void buddy_lookup_request_set_max_results(BuddyLookupRequest *req, int ncount);
+
+
+void sip_setup_register(SipSetup *ss);
+void sip_setup_register_all(MSFactory* factory);
+SipSetup *sip_setup_lookup(const char *type_name);
+void sip_setup_unregister_all(void);
+LINPHONE_PUBLIC unsigned int sip_setup_get_capabilities(SipSetup *s);
+
+SipSetupContext * sip_setup_context_new(SipSetup *s, struct _LinphoneProxyConfig *cfg);
+int sip_setup_context_account_exists(SipSetupContext *ctx, const char *uri);
+int sip_setup_context_account_validated(SipSetupContext *ctx, const char *uri);
+LinphoneStatus sip_setup_context_create_account(SipSetupContext *ctx, const char *uri, const char *passwd, const char *email, int suscribe);
+LINPHONE_PUBLIC int sip_setup_context_get_capabilities(SipSetupContext *ctx);
+LINPHONE_PUBLIC LinphoneStatus sip_setup_context_login_account(SipSetupContext * ctx, const char *uri, const char *passwd, const char *userid);
+LinphoneStatus sip_setup_context_get_proxy(SipSetupContext *ctx, const char *domain, char *proxy, size_t sz);
+LinphoneStatus sip_setup_context_get_stun_servers(SipSetupContext *ctx, char *stun1, char *stun2, size_t size);
+LinphoneStatus sip_setup_context_get_relay(SipSetupContext *ctx, char *relay, size_t size);
+
+LINPHONE_PUBLIC BuddyLookupRequest *sip_setup_context_create_buddy_lookup_request(SipSetupContext *ctx);
+LINPHONE_PUBLIC LinphoneStatus sip_setup_context_buddy_lookup_submit(SipSetupContext *ctx , BuddyLookupRequest *req);
+LINPHONE_PUBLIC LinphoneStatus sip_setup_context_buddy_lookup_free(SipSetupContext *ctx , BuddyLookupRequest *req);
+
+const char * sip_setup_context_get_notice(SipSetupContext *ctx);
+const char ** sip_setup_context_get_domains(SipSetupContext *ctx);
+
+void sip_setup_context_free(SipSetupContext *ctx);
+
+LINPHONE_PUBLIC LinphoneStatus sip_setup_context_logout(SipSetupContext *ctx);
+
+/*internal methods for use WITHIN plugins: do not use elsewhere*/
+struct _LinphoneProxyConfig *sip_setup_context_get_proxy_config(const SipSetupContext *ctx);
+void buddy_lookup_request_free(BuddyLookupRequest *req);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/tunnel.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/tunnel.h"
new file mode 100644
index 0000000..a543aed
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/tunnel.h"
@@ -0,0 +1,419 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef LINPHONE_TUNNEL_H_
+#define LINPHONE_TUNNEL_H_
+
+#include "linphone/types.h"
+
+
+/**
+ * @addtogroup tunnel
+ * @{
+**/
+
+/**
+ * Linphone tunnel aims is to bypass IP traffic blocking due to aggressive firewalls which typically only authorize TCP traffic with destination port 443.
+ * <br> Its principle is tunneling all SIP and/or RTP traffic through a single secure https connection up to a detunnelizer server.
+ * <br> This set of methods enhance  #LinphoneCore functionalities in order to provide an easy to use API to
+ * \li provision tunnel servers IP addresses and ports. This functionality is an option not implemented under GPL. Availability can be check at runtime using function #linphone_core_tunnel_available
+ * \li start/stop the tunneling service
+ * \li perform auto-detection whether tunneling is required, based on a test of sending/receiving a flow of UDP packets.
+ *
+ * It takes in charge automatically the SIP registration procedure when connecting or disconnecting to a tunnel server.
+ * No other action on #LinphoneCore is required to enable full operation in tunnel mode.
+ *
+ * <br> Provision is done using object #LinphoneTunnelConfig created by function #linphone_tunnel_config_new(). Functions #linphone_tunnel_config_set_host
+ *  and #linphone_tunnel_config_set_port allow to point to tunnel server IP/port. Once set, use function #linphone_tunnel_add_server to provision a tunnel server.
+ *  <br> Finally  tunnel mode configuration is achieved by function #linphone_tunnel_set_mode.
+ *  <br> Tunnel connection status can be checked using function #linphone_tunnel_connected.
+ *
+ * Bellow pseudo code that can be use to configure, enable, check state and disable tunnel functionality:
+ *
+ * \code
+	LinphoneTunnel *tunnel = linphone_core_get_tunnel(linphone_core);
+	LinphoneTunnelConfig *config=linphone_tunnel_config_new(); //instantiate tunnel configuration
+	linphone_tunnel_config_set_host(config, "tunnel.linphone.org"); //set tunnel server host address
+	linphone_tunnel_config_set_port(config, 443); //set tunnel server port
+	linphone_tunnel_add_server(tunnel, config); //provision tunnel config
+	linphone_tunnel_set_mode(tunnel, LinphoneTunnelModeEnable); //activate the tunnel unconditional
+
+	while (!linphone_tunnel_connected(tunnel)) { //wait for tunnel to be ready
+		linphone_core_iterate(linphone_core); //schedule core main loop
+		ms_sleep(100); //wait 100ms
+	}
+
+	LinphoneCall *call = linphone_core_invite(linphone_core,"sip:foo@example.org"); //place an outgoing call
+	linphone_call_ref(call); //acquire a reference on the call to avoid deletion after completion
+	//...
+	linphone_core_terminate_call(linphone_core,call);
+
+	while (linphone_call_get_state(call) != LinphoneCallReleased) { //wait for call to be in release state
+		linphone_core_iterate(linphone_core); //schedule core main loop
+		ms_sleep(100); //wait 100ms
+	}
+
+	linphone_tunnel_set_mode(tunnel, LinphoneTunnelModeDisable); //deactivate tunnel
+	linphone_call_unref(call); //release reference on the call
+
+	\endcode
+**/
+
+#define LINPHONE_TUNNEL(obj) BELLE_SIP_CAST(obj, LinphoneTunnel)
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+ * Create a new tunnel configuration
+ */
+LINPHONE_PUBLIC LinphoneTunnelConfig *linphone_tunnel_config_new(void);
+
+/**
+ * Take a reference on a #LinphoneTunnel.
+ * @param[in] tunnel The #LinphoneTunnel whose the ref counter will be increased.
+ * @return Pointer on the freshly refed #LinphoneTunnel.
+ */
+LINPHONE_PUBLIC LinphoneTunnel *linphone_tunnel_ref(LinphoneTunnel *tunnel);
+
+/**
+ * Release a reference on a #LinphoneTunnel.
+ * @param[in] tunnel The #LinphoneTunnel whose the ref counter will be decreased.
+ */
+LINPHONE_PUBLIC void linphone_tunnel_unref(LinphoneTunnel *tunnel);
+
+/**
+ * Set the IP address or hostname of the tunnel server.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @param host The tunnel server IP address or hostname
+ */
+LINPHONE_PUBLIC void linphone_tunnel_config_set_host(LinphoneTunnelConfig *tunnel, const char *host);
+
+/**
+ * Get the IP address or hostname of the tunnel server.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @return The tunnel server IP address or hostname
+ */
+LINPHONE_PUBLIC const char *linphone_tunnel_config_get_host(const LinphoneTunnelConfig *tunnel);
+
+/**
+ * Set tls port of server.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @param port The tunnel server TLS port, recommended value is 443
+ */
+LINPHONE_PUBLIC void linphone_tunnel_config_set_port(LinphoneTunnelConfig *tunnel, int port);
+
+/**
+ * Get the TLS port of the tunnel server.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @return The TLS port of the tunnel server
+ */
+LINPHONE_PUBLIC int linphone_tunnel_config_get_port(const LinphoneTunnelConfig *tunnel);
+
+/**
+ * Set the IP address or hostname of the second tunnel server when using dual tunnel client.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @param host The tunnel server IP address or hostname
+ */
+LINPHONE_PUBLIC void linphone_tunnel_config_set_host2(LinphoneTunnelConfig *tunnel, const char *host);
+
+/**
+ * Get the IP address or hostname of the second tunnel server when using dual tunnel client.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @return The tunnel server IP address or hostname
+ */
+LINPHONE_PUBLIC const char *linphone_tunnel_config_get_host2(const LinphoneTunnelConfig *tunnel);
+
+/**
+ * Set tls port of the second server when using dual tunnel client.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @param port The tunnel server TLS port, recommended value is 443
+ */
+LINPHONE_PUBLIC void linphone_tunnel_config_set_port2(LinphoneTunnelConfig *tunnel, int port);
+
+/**
+ * Get the TLS port of the second tunnel server when using dual tunnel client.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @return The TLS port of the tunnel server
+ */
+LINPHONE_PUBLIC int linphone_tunnel_config_get_port2(const LinphoneTunnelConfig *tunnel);
+
+/**
+ * Set the remote port on the tunnel server side used to test UDP reachability.
+ * This is used when the mode is set auto, to detect whether the tunnel has to be enabled or not.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @param remote_udp_mirror_port The remote port on the tunnel server side used to test UDP reachability, set to -1 to disable the feature
+ */
+LINPHONE_PUBLIC void linphone_tunnel_config_set_remote_udp_mirror_port(LinphoneTunnelConfig *tunnel, int remote_udp_mirror_port);
+
+/**
+ * Get the remote port on the tunnel server side used to test UDP reachability.
+ * This is used when the mode is set auto, to detect whether the tunnel has to be enabled or not.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @return The remote port on the tunnel server side used to test UDP reachability
+ */
+LINPHONE_PUBLIC int linphone_tunnel_config_get_remote_udp_mirror_port(const LinphoneTunnelConfig *tunnel);
+
+/**
+ * Set the UDP packet round trip delay in ms for a tunnel configuration.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @param delay The UDP packet round trip delay in ms considered as acceptable (recommended value is 1000 ms).
+ */
+LINPHONE_PUBLIC void linphone_tunnel_config_set_delay(LinphoneTunnelConfig *tunnel, int delay);
+
+/**
+ * Get the UDP packet round trip delay in ms for a tunnel configuration.
+ * @param tunnel #LinphoneTunnelConfig object
+ * @return The UDP packet round trip delay in ms.
+ */
+LINPHONE_PUBLIC int linphone_tunnel_config_get_delay(const LinphoneTunnelConfig *tunnel);
+
+/**
+ * Increment the refcount of #LinphoneTunnelConfig object.
+ * @param cfg the #LinphoneTunnelConfig object.
+ * @return the same cfg object.
+**/
+LINPHONE_PUBLIC LinphoneTunnelConfig * linphone_tunnel_config_ref(LinphoneTunnelConfig *cfg);
+
+/**
+ * Decrement the refcount of #LinphoneTunnelConfig object.
+ * @param cfg the #LinphoneTunnelConfig object.
+**/
+LINPHONE_PUBLIC void linphone_tunnel_config_unref(LinphoneTunnelConfig *cfg);
+/**
+ * Destroy a tunnel configuration
+ * @param tunnel #LinphoneTunnelConfig object
+ * @deprecated use linphone_tunnel_config_unref().
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_tunnel_config_destroy(LinphoneTunnelConfig *tunnel);
+
+/**
+ * Store a user data in the tunnel config object
+ * @param cfg the tunnel config
+ * @param ud the user data
+**/
+LINPHONE_PUBLIC void linphone_tunnel_config_set_user_data(LinphoneTunnelConfig *cfg, void *ud);
+
+/**
+ * Retrieve user data from the tunnel config
+ * @param cfg the tunnel config
+ * @return the user data
+**/
+LINPHONE_PUBLIC void *linphone_tunnel_config_get_user_data(LinphoneTunnelConfig *cfg);
+
+/**
+ * Add a tunnel server configuration.
+ * @param tunnel #LinphoneTunnel object
+ * @param tunnel_config #LinphoneTunnelConfig object
+ */
+LINPHONE_PUBLIC void linphone_tunnel_add_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config);
+
+/**
+ * Remove a tunnel server configuration.
+ * @param tunnel #LinphoneTunnel object
+ * @param tunnel_config #LinphoneTunnelConfig object
+ */
+LINPHONE_PUBLIC void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config);
+
+/**
+ * Get added servers
+ * @param tunnel #LinphoneTunnel object
+ * @return \bctbx_list{LinphoneTunnelConfig}
+ */
+LINPHONE_PUBLIC const bctbx_list_t *linphone_tunnel_get_servers(const LinphoneTunnel *tunnel);
+
+/**
+ * Remove all tunnel server addresses previously entered with linphone_tunnel_add_server()
+ * @param tunnel #LinphoneTunnel object
+**/
+LINPHONE_PUBLIC void linphone_tunnel_clean_servers(LinphoneTunnel *tunnel);
+
+/**
+ * Set the tunnel mode.
+ * The tunnel mode can be 'enable', 'disable' or 'auto'
+ * If the mode is set to 'auto', the tunnel manager will try to established an RTP session
+ * with the tunnel server on the UdpMirrorPort. If the connection fail, the tunnel is automatically
+ * activated whereas the tunnel is automatically disabled if the connection succeed.
+ * @param tunnel #LinphoneTunnel object
+ * @param mode The desired #LinphoneTunnelMode
+**/
+LINPHONE_PUBLIC void linphone_tunnel_set_mode(LinphoneTunnel *tunnel, LinphoneTunnelMode mode);
+
+/**
+ * Get the tunnel mode
+ * @param tunnel #LinphoneTunnel object
+ * @return The current #LinphoneTunnelMode
+**/
+LINPHONE_PUBLIC LinphoneTunnelMode linphone_tunnel_get_mode(const LinphoneTunnel *tunnel);
+
+/**
+ * Sets whether or not to use the dual tunnel client mode.
+ * By default this feature is disabled.
+ * After enabling it, add a server with 2 hosts and 2 ports for the feature to work.
+ * @param tunnel #LinphoneTunnel object
+ * @param dual_mode_enabled TRUE to enable it, FALSE to disable it
+ */
+LINPHONE_PUBLIC void linphone_tunnel_enable_dual_mode(LinphoneTunnel *tunnel, bool_t dual_mode_enabled);
+
+/**
+ * Get the dual tunnel client mode
+ * @param tunnel #LinphoneTunnel object
+ * @return TRUE if dual tunnel client mode is enabled, FALSE otherwise
+**/
+LINPHONE_PUBLIC bool_t linphone_tunnel_dual_mode_enabled(const LinphoneTunnel *tunnel);
+
+/**
+ * Returns whether the tunnel is activated. If mode is set to auto, this gives indication whether the automatic detection determined
+ * that tunnel was necessary or not.
+ * @param tunnel the tunnel
+ * @return TRUE if tunnel is in use, FALSE otherwise.
+**/
+LINPHONE_PUBLIC bool_t linphone_tunnel_get_activated(const LinphoneTunnel *tunnel);
+
+
+/**
+ * Check whether the tunnel is connected
+ * @param tunnel #LinphoneTunnel object
+ * @return A boolean value telling if the tunnel is connected
+**/
+LINPHONE_PUBLIC bool_t linphone_tunnel_connected(const LinphoneTunnel *tunnel);
+
+/**
+ * Force reconnection to the tunnel server.
+ * This method is useful when the device switches from wifi to Edge/3G or vice versa. In most cases the tunnel client socket
+ * won't be notified promptly that its connection is now zombie, so it is recommended to call this method that will cause
+ * the lost connection to be closed and new connection to be issued.
+ * @param tunnel #LinphoneTunnel object
+**/
+LINPHONE_PUBLIC void linphone_tunnel_reconnect(LinphoneTunnel *tunnel);
+
+/**
+ * Set whether SIP packets must be directly sent to a UA or pass through the tunnel
+ * @param tunnel #LinphoneTunnel object
+ * @param enable If true, SIP packets shall pass through the tunnel
+ */
+LINPHONE_PUBLIC void linphone_tunnel_enable_sip(LinphoneTunnel *tunnel, bool_t enable);
+
+/**
+ * Check whether tunnel is set to transport SIP packets
+ * @param tunnel #LinphoneTunnel object
+ * @return A boolean value telling whether SIP packets shall pass through the tunnel
+ */
+LINPHONE_PUBLIC bool_t linphone_tunnel_sip_enabled(const LinphoneTunnel *tunnel);
+
+/**
+ * Set an optional http proxy to go through when connecting to tunnel server.
+ * @param tunnel #LinphoneTunnel object
+ * @param host http proxy host
+ * @param port http proxy port
+ * @param username Optional http proxy username if the proxy request authentication. Currently only basic authentication is supported. Use NULL if not needed.
+ * @param passwd Optional http proxy password. Use NULL if not needed.
+ **/
+LINPHONE_PUBLIC void linphone_tunnel_set_http_proxy(LinphoneTunnel *tunnel, const char *host, int port, const char* username,const char* passwd);
+
+/**
+ * Retrieve optional http proxy configuration previously set with linphone_tunnel_set_http_proxy().
+ * @param tunnel #LinphoneTunnel object
+ * @param host http proxy host
+ * @param port http proxy port
+ * @param username Optional http proxy username if the proxy request authentication. Currently only basic authentication is supported. Use NULL if not needed.
+ * @param passwd Optional http proxy password. Use NULL if not needed.
+ * @donotwrap
+ **/
+LINPHONE_PUBLIC void linphone_tunnel_get_http_proxy(LinphoneTunnel*tunnel,const char **host, int *port, const char **username, const char **passwd);
+
+/**
+ * Set authentication info for the http proxy
+ * @param tunnel #LinphoneTunnel object
+ * @param username User name
+ * @param passwd Password
+ */
+LINPHONE_PUBLIC void linphone_tunnel_set_http_proxy_auth_info(LinphoneTunnel*tunnel, const char* username,const char* passwd);
+
+/**
+ * Sets whether tunneling of SIP and RTP is required.
+ * @param tunnel object
+ * @param enabled If true enter in tunneled mode, if false exits from tunneled mode.
+ * The TunnelManager takes care of refreshing SIP registration when switching on or off the tunneled mode.
+ * @deprecated Replaced by linphone_tunnel_set_mode()
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_tunnel_enable(LinphoneTunnel *tunnel, bool_t enabled);
+
+/**
+ * Check whether tunnel is enabled
+ * @param tunnel Tunnel object
+ * @return Returns a boolean indicating whether tunneled operation is enabled.
+ * @deprecated Replaced by linphone_tunnel_get_mode()
+ * @donotwrap
+**/
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_tunnel_enabled(const LinphoneTunnel *tunnel);
+
+/**
+ * Start tunnel need detection.
+ * @param  tunnel object
+ * In auto detect mode, the tunnel manager try to establish a real time rtp communication with the tunnel server on  specified port.
+ * <br>In case of success, the tunnel is automatically turned off. Otherwise, if no udp communication is feasible, tunnel mode is turned on.
+ * <br> Call this method each time to run the auto detection algorithm
+ * @deprecated Replaced by linphone_tunnel_set_mode(LinphoneTunnelModeAuto)
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_tunnel_auto_detect(LinphoneTunnel *tunnel);
+
+/**
+ * Tell whether tunnel auto detection is enabled.
+ * @param[in] tunnel #LinphoneTunnel object.
+ * @return TRUE if auto detection is enabled, FALSE otherwise.
+ * @deprecated Replaced by linphone_tunnel_get_mode()
+ * @donotwrap
+ */
+LINPHONE_PUBLIC LINPHONE_DEPRECATED bool_t linphone_tunnel_auto_detect_enabled(LinphoneTunnel *tunnel);
+
+LINPHONE_PUBLIC void linphone_tunnel_simulate_udp_loss(LinphoneTunnel *tunnel, bool_t enabled);
+
+/**
+ * @}
+**/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* LINPHONE_TUNNEL_H_ */
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/types.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/types.h"
new file mode 100644
index 0000000..5b62a90
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/types.h"
@@ -0,0 +1,1226 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_TYPES_H_
+#define LINPHONE_TYPES_H_
+
+
+#include "ortp/payloadtype.h"
+#include "mediastreamer2/msinterfaces.h"
+#include "mediastreamer2/msvideo.h"
+#include "linphone/defs.h"
+
+// For migration purpose.
+#include "linphone/api/c-types.h"
+
+/**
+ * The #LinphoneAccountCreator object used to configure an account on a server via XML-RPC.
+ * @ingroup account_creator
+**/
+typedef struct _LinphoneAccountCreator LinphoneAccountCreator;
+
+/**
+ * An object to define a #LinphoneAccountCreator service.
+ * @ingroup account_creator
+ * @donotwrap
+**/
+typedef struct _LinphoneAccountCreatorService LinphoneAccountCreatorService;
+
+/**
+ * An object to handle the responses callbacks for handling the #LinphoneAccountCreator operations.
+ * @ingroup account_creator
+**/
+typedef struct _LinphoneAccountCreatorCbs LinphoneAccountCreatorCbs;
+
+/**
+ * Enum describing Phone number checking.
+ * @ingroup account_creator
+**/
+typedef enum _LinphoneAccountCreatorPhoneNumberStatus {
+	LinphoneAccountCreatorPhoneNumberStatusOk = 0x1, /**< Phone number ok */
+	LinphoneAccountCreatorPhoneNumberStatusTooShort = 0x2, /**< Phone number too short */
+	LinphoneAccountCreatorPhoneNumberStatusTooLong = 0x4, /**< Phone number too long */
+	LinphoneAccountCreatorPhoneNumberStatusInvalidCountryCode = 0x8, /**< Country code invalid */
+	LinphoneAccountCreatorPhoneNumberStatusInvalid = 0x10 /**< Phone number invalid */
+} LinphoneAccountCreatorPhoneNumberStatus;
+
+/**
+ * A mask of #LinphoneAccountCreatorPhoneNumberStatus values
+ * @ingroup account_creator
+ */
+typedef unsigned int LinphoneAccountCreatorPhoneNumberStatusMask;
+
+/**
+ * Enum describing Username checking.
+ * @ingroup account_creator
+**/
+typedef enum _LinphoneAccountCreatorUsernameStatus {
+	LinphoneAccountCreatorUsernameStatusOk, /**< Username ok */
+	LinphoneAccountCreatorUsernameStatusTooShort, /**< Username too short */
+	LinphoneAccountCreatorUsernameStatusTooLong,  /**< Username too long */
+	LinphoneAccountCreatorUsernameStatusInvalidCharacters, /**< Contain invalid characters */
+	LinphoneAccountCreatorUsernameStatusInvalid /**< Invalid username */
+} LinphoneAccountCreatorUsernameStatus;
+
+/**
+ * Enum describing Email checking.
+ * @ingroup account_creator
+**/
+typedef enum _LinphoneAccountCreatorEmailStatus {
+	LinphoneAccountCreatorEmailStatusOk, /**< Email ok */
+	LinphoneAccountCreatorEmailStatusMalformed, /**< Email malformed */
+	LinphoneAccountCreatorEmailStatusInvalidCharacters /**< Contain invalid characters */
+} LinphoneAccountCreatorEmailStatus;
+
+/**
+ * Enum describing Password checking.
+ * @ingroup account_creator
+**/
+typedef enum _LinphoneAccountCreatorPasswordStatus {
+	LinphoneAccountCreatorPasswordStatusOk, /**< Password ok */
+	LinphoneAccountCreatorPasswordStatusTooShort, /**< Password too short */
+	LinphoneAccountCreatorPasswordStatusTooLong,  /**< Password too long */
+	LinphoneAccountCreatorPasswordStatusInvalidCharacters, /**< Contain invalid characters */
+	LinphoneAccountCreatorPasswordStatusMissingCharacters /**< Missing specific characters */
+} LinphoneAccountCreatorPasswordStatus;
+
+/**
+ * Enum describing language checking.
+ * @ingroup account_creator
+**/
+typedef enum _LinphoneAccountCreatorLanguageStatus {
+	LinphoneAccountCreatorLanguageStatusOk /**< Language ok */
+} LinphoneAccountCreatorLanguageStatus;
+
+
+/**
+ * Enum algorithm checking.
+ * @ingroup account_creator
+ **/
+typedef enum _LinphoneAccountCreatorAlgoStatus {
+	LinphoneAccountCreatorAlgoStatusOk, /**< Algorithm ok */
+	LinphoneAccountCreatorAlgoStatusNotSupported /**< Algorithm not supported */
+} LinphoneAccountCreatorAlgoStatus;
+
+/**
+ * Enum describing Activation code checking.
+ * @ingroup account_creator
+**/
+typedef enum _LinphoneAccountCreatorActivationCodeStatus {
+	LinphoneAccountCreatorActivationCodeStatusOk, /**< Activation code ok */
+	LinphoneAccountCreatorActivationCodeStatusTooShort, /**< Activation code too short */
+	LinphoneAccountCreatorActivationCodeStatusTooLong, /**< Activation code too long */
+	LinphoneAccountCreatorActivationCodeStatusInvalidCharacters /**< Contain invalid characters */
+} LinphoneAccountCreatorActivationCodeStatus;
+
+/**
+ * Enum describing Domain checking
+ * @ingroup account_creator
+**/
+typedef enum _LinphoneAccountCreatorDomainStatus {
+	LinphoneAccountCreatorDomainOk, /**< Domain ok */
+	LinphoneAccountCreatorDomainInvalid /**< Domain invalid */
+} LinphoneAccountCreatorDomainStatus;
+
+/**
+ * Enum describing Transport checking
+ * @ingroup account_creator
+**/
+typedef enum _LinphoneAccountCreatorTransportStatus {
+	LinphoneAccountCreatorTransportOk, /**< Transport ok */
+	LinphoneAccountCreatorTransportUnsupported /**< Transport invalid */
+} LinphoneAccountCreatorTransportStatus;
+
+/**
+ * Enum describing the status of server request.
+ * @ingroup account_creator_request
+**/
+typedef enum _LinphoneAccountCreatorStatus {
+	/** Request status **/
+	LinphoneAccountCreatorStatusRequestOk, /**< Request passed */
+	LinphoneAccountCreatorStatusRequestFailed, /**< Request failed */
+	LinphoneAccountCreatorStatusMissingArguments, /**< Request failed due to missing argument(s) */
+	LinphoneAccountCreatorStatusMissingCallbacks, /**< Request failed due to missing callback(s) */
+
+	/** Account status **/
+	/* Creation */
+	LinphoneAccountCreatorStatusAccountCreated, /**< Account created */
+	LinphoneAccountCreatorStatusAccountNotCreated, /**< Account not created */
+	/* Existence */
+	LinphoneAccountCreatorStatusAccountExist, /**< Account exist */
+	LinphoneAccountCreatorStatusAccountExistWithAlias, /**< Account exist with alias */
+	LinphoneAccountCreatorStatusAccountNotExist, /**< Account not exist */
+	LinphoneAccountCreatorStatusAliasIsAccount, /**< Account was created with Alias */
+	LinphoneAccountCreatorStatusAliasExist, /**< Alias exist */
+	LinphoneAccountCreatorStatusAliasNotExist, /**< Alias not exist */
+	/* Activation */
+	LinphoneAccountCreatorStatusAccountActivated, /**< Account activated */
+	LinphoneAccountCreatorStatusAccountAlreadyActivated, /**< Account already activated */
+	LinphoneAccountCreatorStatusAccountNotActivated, /**< Account not activated */
+	/* Linking */
+	LinphoneAccountCreatorStatusAccountLinked, /**< Account linked */
+	LinphoneAccountCreatorStatusAccountNotLinked, /**< Account not linked */
+
+	/** Server **/
+	LinphoneAccountCreatorStatusServerError, /**< Error server */
+
+	LinphoneAccountCreatorStatusPhoneNumberInvalid, /**< Error cannot send SMS */
+	LinphoneAccountCreatorStatusWrongActivationCode, /**< Error key doesn't match */
+	LinphoneAccountCreatorStatusPhoneNumberOverused, /**< Error too many SMS sent */
+	LinphoneAccountCreatorStatusAlgoNotSupported, /** < Error algo isn't MD5 or SHA-256 */
+} LinphoneAccountCreatorStatus;
+
+/**
+ * Enum describing Ip family.
+ * @ingroup initializing
+**/
+typedef enum _LinphoneAddressFamily {
+	LinphoneAddressFamilyInet, /**< IpV4 */
+	LinphoneAddressFamilyInet6, /**< IpV6 */
+	LinphoneAddressFamilyUnspec, /**< Unknown */
+} LinphoneAddressFamily;
+
+/**
+ * Enum describing type of audio route.
+ * @ingroup call_control
+**/
+typedef enum _LinphoneAudioRoute {
+	LinphoneAudioRouteEarpiece,
+	LinphoneAudioRouteSpeaker
+} LinphoneAudioRoute;
+
+/**
+ * Object holding authentication information.
+ *
+ * @note The object's fields should not be accessed directly. Prefer using
+ * the accessor methods.
+ *
+ * In most case, authentication information consists of a username and password.
+ * Sometimes, a userid is required by proxy, and realm can be useful to discriminate
+ * different SIP domains.
+ *
+ * Once created and filled, a #LinphoneAuthInfo must be added to the #LinphoneCore in
+ * order to become known and used automatically when needed.
+ * Use linphone_core_add_auth_info() for that purpose.
+ *
+ * The #LinphoneCore object can take the initiative to request authentication information
+ * when needed to the application through the auth_info_requested callback of the
+ * #LinphoneCoreVTable structure.
+ *
+ * The application can respond to this information request later using
+ * linphone_core_add_auth_info(). This will unblock all pending authentication
+ * transactions and retry them with authentication headers.
+ *
+ * @ingroup authentication
+**/
+typedef struct _LinphoneAuthInfo LinphoneAuthInfo;
+
+/**
+ * Enum describing the authentication methods
+ * @ingroup network_parameters
+**/
+typedef enum _LinphoneAuthMethod {
+	LinphoneAuthHttpDigest, /**< Digest authentication requested */
+	LinphoneAuthTls, /**< Client certificate requested */
+} LinphoneAuthMethod;
+
+/**
+ * Enum describing RTP AVPF activation modes.
+ * @ingroup media_parameters
+**/
+typedef enum _LinphoneAVPFMode {
+	LinphoneAVPFDefault = -1, /**< Use default value defined at upper level */
+	LinphoneAVPFDisabled, /**< AVPF is disabled */
+	LinphoneAVPFEnabled /**< AVPF is enabled */
+} LinphoneAVPFMode;
+
+/**
+ * The #LinphoneContent object representing a data buffer.
+ * @ingroup misc
+**/
+typedef struct _LinphoneBuffer LinphoneBuffer;
+
+/**
+ * Enum representing the direction of a call.
+ * @ingroup call_logs
+**/
+typedef enum _LinphoneCallDir {
+	LinphoneCallOutgoing, /**< outgoing calls*/
+	LinphoneCallIncoming  /**< incoming calls*/
+} LinphoneCallDir;
+
+/**
+ * Structure representing a call log.
+ * @ingroup call_logs
+**/
+typedef struct _LinphoneCallLog LinphoneCallLog;
+
+/**
+ * The #LinphoneCallParams is an object containing various call related parameters.
+ * It can be used to retrieve parameters from a currently running call or modify
+ * the call's characteristics dynamically.
+ * @ingroup call_control
+**/
+typedef struct _LinphoneCallParams LinphoneCallParams;
+
+/**
+ * The #LinphoneCallStats objects carries various statistic informations regarding quality of audio or video streams.
+ *
+ * To receive these informations periodically and as soon as they are computed, the application is invited to place a #LinphoneCoreCallStatsUpdatedCb callback in the #LinphoneCoreVTable structure
+ * it passes for instanciating the #LinphoneCore object (see linphone_core_new() ).
+ *
+ * At any time, the application can access last computed statistics using linphone_call_get_audio_stats() or linphone_call_get_video_stats().
+ * @ingroup call_misc
+**/
+typedef struct _LinphoneCallStats LinphoneCallStats;
+
+/**
+ * Enum representing the status of a call
+ * @ingroup call_logs
+**/
+typedef enum _LinphoneCallStatus {
+	LinphoneCallSuccess, /**< The call was sucessful */
+	LinphoneCallAborted, /**< The call was aborted */
+	LinphoneCallMissed, /**< The call was missed (unanswered) */
+	LinphoneCallDeclined, /**< The call was declined, either locally or by remote end */
+	LinphoneCallEarlyAborted, /**<The call was aborted before being advertised to the application - for protocol reasons*/
+	LinphoneCallAcceptedElsewhere, /**<The call was answered on another device*/
+	LinphoneCallDeclinedElsewhere /**<The call was declined on another device*/
+} LinphoneCallStatus;
+
+/**
+ * #LinphoneConference class
+ * The _LinphoneConference struct does not exists, it's the Conference C++ class that is used behind
+ * @ingroup call_control
+ */
+typedef struct _LinphoneConference LinphoneConference;
+
+/**
+ * Parameters for initialization of conferences
+ * The _LinphoneConferenceParams struct does not exists, it's the ConferenceParams C++ class that is used behind
+ * @ingroup call_control
+ */
+typedef struct _LinphoneConferenceParams LinphoneConferenceParams;
+
+/**
+ * The #LinphoneConfig object is used to manipulate a configuration file.
+ *
+ * The format of the configuration file is a .ini like format:
+ * - sections are defined in []
+ * - each section contains a sequence of key=value pairs.
+ *
+ * Example:
+ * @code
+ * [sound]
+ * echocanceler=1
+ * playback_dev=ALSA: Default device
+ *
+ * [video]
+ * enabled=1
+ * @endcode
+ *
+ * @ingroup misc
+**/
+typedef struct _LpConfig LinphoneConfig;
+
+/**
+ * Define old struct name for backward compatibility
+ */
+#define LpConfig LinphoneConfig
+
+/**
+ * #LinphoneGlobalState describes the global state of the #LinphoneCore object.
+ * It is notified via the LinphoneCoreVTable::global_state_changed
+ * @ingroup initializing
+**/
+typedef enum _LinphoneConfiguringState {
+	LinphoneConfiguringSuccessful,
+	LinphoneConfiguringFailed,
+	LinphoneConfiguringSkipped
+} LinphoneConfiguringState;
+
+/**
+ * Consolidated presence information: 'online' means the user is open for communication,
+ * 'busy' means the user is open for communication but involved in an other activity,
+ * 'do not disturb' means the user is not open for communication, and 'offline' means
+ * that no presence information is available.
+ * @ingroup buddy_list
+ */
+typedef enum _LinphoneConsolidatedPresence {
+	LinphoneConsolidatedPresenceOnline,
+	LinphoneConsolidatedPresenceBusy,
+	LinphoneConsolidatedPresenceDoNotDisturb,
+	LinphoneConsolidatedPresenceOffline
+} LinphoneConsolidatedPresence;
+
+typedef struct _LinphoneContactProvider LinphoneContactProvider;
+
+typedef struct _LinphoneContactSearch LinphoneContactSearch;
+
+typedef unsigned int LinphoneContactSearchID;
+
+/**
+ * Old name of #LinphoneContactSearchID
+ * @deprecated
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED typedef LinphoneContactSearchID ContactSearchID;
+
+/**
+ * Linphone core main object created by function linphone_core_new() .
+ * @ingroup initializing
+ */
+typedef struct _LinphoneCore LinphoneCore;
+
+/**
+ * That class holds all the callbacks which are called by #LinphoneCore.
+ *
+ * Use linphone_factory_create_core_cbs() to create an instance. Then, call the
+ * callback setters on the events you need to monitor and pass the object to
+ * a #LinphoneCore instance through linphone_core_add_callbacks().
+ *
+ * That class is inherited from belle_sip_object_t.
+ * @ingroup initializing
+ */
+typedef struct _LinphoneCoreCbs LinphoneCoreCbs;
+
+typedef struct belle_sip_dict LinphoneDictionary;
+
+/**
+ * Enum describing the result of the echo canceller calibration process.
+ * @ingroup media_parameters
+**/
+typedef enum _LinphoneEcCalibratorStatus {
+	LinphoneEcCalibratorInProgress, /**< The echo canceller calibration process is on going */
+	LinphoneEcCalibratorDone, /**< The echo canceller calibration has been performed and produced an echo delay measure */
+	LinphoneEcCalibratorFailed, /**< The echo canceller calibration process has failed */
+	LinphoneEcCalibratorDoneNoEcho /**< The echo canceller calibration has been performed and no echo has been detected */
+} LinphoneEcCalibratorStatus;
+
+/**
+ * Object representing full details about a signaling error or status.
+ * All #LinphoneErrorInfo object returned by the liblinphone API are readonly and transcients. For safety they must be used immediately
+ * after obtaining them. Any other function call to the liblinphone may change their content or invalidate the pointer.
+ * @ingroup misc
+**/
+typedef struct _LinphoneErrorInfo LinphoneErrorInfo;
+
+/**
+ * Object representing an event state, which is subcribed or published.
+ * @see linphone_core_publish()
+ * @see linphone_core_subscribe()
+ * @ingroup event_api
+**/
+typedef struct _LinphoneEvent LinphoneEvent;
+
+/**
+ * An object to handle the callbacks for handling the LinphoneEvent operations.
+ * @ingroup event_api
+**/
+typedef struct _LinphoneEventCbs LinphoneEventCbs;
+
+/**
+ * #LinphoneFactory is a singleton object devoted to the creation of all the object
+ * of Liblinphone that cannot be created by #LinphoneCore itself.
+ * @ingroup initializing
+ */
+typedef struct _LinphoneFactory LinphoneFactory;
+
+/**
+ * Policy to use to pass through firewalls.
+ * @ingroup network_parameters
+ * @deprecated Use #LinphoneNatPolicy instead.
+ * @donotwrap
+**/
+typedef enum _LinphoneFirewallPolicy {
+	LinphonePolicyNoFirewall, /**< Do not use any mechanism to pass through firewalls */
+	LinphonePolicyUseNatAddress, /**< Use the specified public adress */
+	LinphonePolicyUseStun, /**< Use a STUN server to get the public address */
+	LinphonePolicyUseIce, /**< Use the ICE protocol */
+	LinphonePolicyUseUpnp, /**< Use the uPnP protocol */
+} LinphoneFirewallPolicy;
+
+/**
+ * Represents a buddy, all presence actions like subscription and status change notification are performed on this object
+ * @ingroup buddy_list
+ */
+typedef struct _LinphoneFriend LinphoneFriend;
+
+/**
+* Enum describing the status of a LinphoneFriendList operation.
+* @ingroup buddy_list
+**/
+typedef enum _LinphoneFriendCapability {
+	LinphoneFriendCapabilityNone = 0,
+	LinphoneFriendCapabilityGroupChat = 1 << 0,
+	LinphoneFriendCapabilityLimeX3dh = 1 << 1
+} LinphoneFriendCapability;
+
+/**
+ * The #LinphoneFriendList object representing a list of friends.
+ * @ingroup buddy_list
+**/
+typedef struct _LinphoneFriendList LinphoneFriendList;
+
+/**
+ * An object to handle the callbacks for #LinphoneFriend synchronization.
+ * @ingroup buddy_list
+**/
+typedef struct _LinphoneFriendListCbs LinphoneFriendListCbs;
+
+/**
+* Enum describing the status of a LinphoneFriendList operation.
+* @ingroup buddy_list
+**/
+typedef enum _LinphoneFriendListStatus {
+	LinphoneFriendListOK,
+	LinphoneFriendListNonExistentFriend,
+	LinphoneFriendListInvalidFriend
+} LinphoneFriendListStatus;
+
+/**
+ * Enum describing the status of a CardDAV synchronization
+ * @ingroup buddy_list
+ */
+typedef enum _LinphoneFriendListSyncStatus {
+	LinphoneFriendListSyncStarted,
+	LinphoneFriendListSyncSuccessful,
+	LinphoneFriendListSyncFailure
+} LinphoneFriendListSyncStatus;
+
+/**
+ * #LinphoneGlobalState describes the global state of the #LinphoneCore object.
+ * It is notified via the LinphoneCoreVTable::global_state_changed
+ * @ingroup initializing
+**/
+typedef enum _LinphoneGlobalState {
+	/** State in which we're in after linphone_core_stop(). Do not call any method while in this state except for linphone_core_start() */
+	LinphoneGlobalOff,
+	/** Transient state for when we call linphone_core_start() */
+	LinphoneGlobalStartup,
+	/** Indicates #LinphoneCore has been started and is up and running */
+	LinphoneGlobalOn,
+	/** Transient state for when we call linphone_core_stop() */
+	LinphoneGlobalShutdown,
+	/** Transient state between Startup and On if there is a remote provisionning URI configured */
+	LinphoneGlobalConfiguring,
+	/** #LinphoneCore state after being created by linphone_factory_create_core(), generally followed by a call to linphone_core_start() */
+	LinphoneGlobalReady
+} LinphoneGlobalState;
+
+/**
+ * Enum describing ICE states.
+ * @ingroup initializing
+**/
+typedef enum _LinphoneIceState {
+	LinphoneIceStateNotActivated, /**< ICE has not been activated for this call or stream*/
+	LinphoneIceStateFailed, /**< ICE processing has failed */
+	LinphoneIceStateInProgress, /**< ICE process is in progress */
+	LinphoneIceStateHostConnection, /**< ICE has established a direct connection to the remote host */
+	LinphoneIceStateReflexiveConnection, /**< ICE has established a connection to the remote host through one or several NATs */
+	LinphoneIceStateRelayConnection /**< ICE has established a connection through a relay */
+} LinphoneIceState;
+
+/**
+ * IM encryption engine.
+ * @ingroup misc
+ * @donotwrap
+ */
+typedef struct _LinphoneImEncryptionEngine LinphoneImEncryptionEngine;
+
+/**
+ * An object to handle the callbacks for the handling a #LinphoneImEncryptionEngine object.
+ * @ingroup misc
+ * @donotwrap
+ */
+typedef struct _LinphoneImEncryptionEngineCbs LinphoneImEncryptionEngineCbs;
+
+/**
+ * Policy to use to send/receive instant messaging composing/delivery/display notifications.
+ * The sending of this information is done as in the RFCs 3994 (is_composing) and 5438 (imdn delivered/displayed).
+ * @ingroup chatroom
+ */
+typedef struct _LinphoneImNotifPolicy LinphoneImNotifPolicy;
+
+/**
+ * The #LinphoneInfoMessage is an object representing an informational message sent or received by the core.
+ * @ingroup misc
+**/
+typedef struct _LinphoneInfoMessage LinphoneInfoMessage;
+
+typedef struct _LinphoneLDAPContactProvider LinphoneLDAPContactProvider;
+
+typedef struct _LinphoneLDAPContactSearch LinphoneLDAPContactSearch;
+
+/**
+ * @ingroup network_parameters
+ */
+typedef enum _LinphoneLimeState {
+	LinphoneLimeDisabled, /**< Lime is not used at all */
+	LinphoneLimeMandatory, /**< Lime is always used */
+	LinphoneLimePreferred, /**< Lime is used only if we already shared a secret with remote */
+} LinphoneLimeState;
+
+/**
+ * @ingroup initializing
+ */
+typedef enum _LinphoneLogCollectionState {
+	LinphoneLogCollectionDisabled,
+	LinphoneLogCollectionEnabled,
+	LinphoneLogCollectionEnabledWithoutPreviousLogHandler
+} LinphoneLogCollectionState;
+
+/**
+ * #LinphoneCoreLogCollectionUploadState is used to notify if log collection upload have been succesfully delivered or not.
+ * @ingroup initializing
+ */
+typedef enum _LinphoneCoreLogCollectionUploadState {
+	LinphoneCoreLogCollectionUploadStateInProgress, /**< Delivery in progress */
+	LinphoneCoreLogCollectionUploadStateDelivered, /**< Log collection upload successfully delivered and acknowledged by remote end point */
+	LinphoneCoreLogCollectionUploadStateNotDelivered, /**< Log collection upload was not delivered */
+} LinphoneCoreLogCollectionUploadState;
+
+/**
+ * Indicates for a given media the stream direction
+ * @ingroup call_control
+ */
+typedef enum _LinphoneMediaDirection {
+	LinphoneMediaDirectionInvalid = -1,
+	LinphoneMediaDirectionInactive, /** No active media not supported yet*/
+	LinphoneMediaDirectionSendOnly, /** Send only mode*/
+	LinphoneMediaDirectionRecvOnly, /** recv only mode*/
+	LinphoneMediaDirectionSendRecv, /** send receive*/
+} LinphoneMediaDirection;
+
+/**
+ * Enum describing type of media encryption types.
+ * @ingroup media_parameters
+**/
+typedef enum _LinphoneMediaEncryption {
+	LinphoneMediaEncryptionNone, /**< No media encryption is used */
+	LinphoneMediaEncryptionSRTP, /**< Use SRTP media encryption */
+	LinphoneMediaEncryptionZRTP, /**< Use ZRTP media encryption */
+	LinphoneMediaEncryptionDTLS /**< Use DTLS media encryption */
+} LinphoneMediaEncryption;
+
+/**
+ * Enum describing the ZRTP SAS validation status of a peer URI
+ * @ingroup media_parameters
+**/
+typedef enum _LinphoneZrtpPeerStatus {
+	LinphoneZrtpPeerStatusUnknown, /**< Peer URI unkown or never validated/invalidated the SAS */
+	LinphoneZrtpPeerStatusInvalid, /**< Peer URI SAS rejected in database */
+	LinphoneZrtpPeerStatusValid /**< Peer URI SAS validated in database */
+} LinphoneZrtpPeerStatus;
+
+/**
+ * Policy to use to pass through NATs/firewalls.
+ * @ingroup network_parameters
+ */
+typedef struct _LinphoneNatPolicy LinphoneNatPolicy;
+
+/**
+ * Enum describing remote friend status
+ * @deprecated Use #LinphonePresenceModel and #LinphonePresenceActivity instead
+ * @donotwrap
+ */
+typedef enum _LinphoneOnlineStatus{
+	LinphoneStatusOffline, /**< Offline */
+	LinphoneStatusOnline, /**< Online */
+	LinphoneStatusBusy, /**< Busy */
+	LinphoneStatusBeRightBack, /**< Be right back */
+	LinphoneStatusAway, /**< Away */
+	LinphoneStatusOnThePhone, /** On the phone */
+	LinphoneStatusOutToLunch, /**< Out to lunch */
+	LinphoneStatusDoNotDisturb, /**< Do not disturb */
+	LinphoneStatusMoved, /**< Moved in this sate, call can be redirected if an alternate contact address has been set using function linphone_core_set_presence_info() */
+	LinphoneStatusAltService, /**< Using another messaging service */
+	LinphoneStatusPending, /**< Pending */
+	LinphoneStatusVacation, /**< Vacation */
+
+	LinphoneStatusEnd
+} LinphoneOnlineStatus;
+
+/**
+ * Player interface.
+ * @ingroup call_control
+**/
+typedef struct _LinphonePlayer LinphonePlayer;
+
+/**
+ * An object to handle the callbacks for the handling a #LinphonePlayer objects.
+ * @ingroup call_control
+ */
+typedef struct _LinphonePlayerCbs LinphonePlayerCbs;
+
+/**
+ * The state of a LinphonePlayer.
+ * @ingroup call_control
+ */
+typedef enum LinphonePlayerState {
+	LinphonePlayerClosed, /**< No file is opened for playing. */
+	LinphonePlayerPaused, /**< The player is paused. */
+	LinphonePlayerPlaying /**< The player is playing. */
+} LinphonePlayerState;
+
+/**
+ * Presence activity type holding information about a presence activity.
+ * @ingroup buddy_list
+ */
+typedef struct _LinphonePresenceActivity LinphonePresenceActivity;
+
+/**
+ * Activities as defined in section 3.2 of RFC 4480
+ * @ingroup buddy_list
+ */
+typedef enum LinphonePresenceActivityType {
+	/** The person has a calendar appointment, without specifying exactly of what type. This activity is
+	 *  indicated if more detailed information is not available or the person chooses not to reveal more
+	 * information. */
+	LinphonePresenceActivityAppointment,
+
+	/** The person is physically away from all interactive communication devices. */
+	LinphonePresenceActivityAway,
+
+	/** The person is eating the first meal of the day, usually eaten in the morning. */
+	LinphonePresenceActivityBreakfast,
+
+	/** The person is busy, without further details. */
+	LinphonePresenceActivityBusy,
+
+	/** The person is having his or her main meal of the day, eaten in the evening or at midday. */
+	LinphonePresenceActivityDinner,
+
+	/**  This is a scheduled national or local holiday. */
+	LinphonePresenceActivityHoliday,
+
+	/** The person is riding in a vehicle, such as a car, but not steering. */
+	LinphonePresenceActivityInTransit,
+
+	/** The person is looking for (paid) work. */
+	LinphonePresenceActivityLookingForWork,
+
+	/** The person is eating his or her midday meal. */
+	LinphonePresenceActivityLunch,
+
+	/** The person is scheduled for a meal, without specifying whether it is breakfast, lunch, or dinner,
+	 *  or some other meal. */
+	LinphonePresenceActivityMeal,
+
+	/** The person is in an assembly or gathering of people, as for a business, social, or religious purpose.
+	 *  A meeting is a sub-class of an appointment. */
+	LinphonePresenceActivityMeeting,
+
+	/** The person is talking on the telephone. */
+	LinphonePresenceActivityOnThePhone,
+
+	/** The person is engaged in an activity with no defined representation. A string describing the activity
+	 *  in plain text SHOULD be provided. */
+	LinphonePresenceActivityOther,
+
+	/** A performance is a sub-class of an appointment and includes musical, theatrical, and cinematic
+	 *  performances as well as lectures. It is distinguished from a meeting by the fact that the person
+	 *  may either be lecturing or be in the audience, with a potentially large number of other people,
+	 *  making interruptions particularly noticeable. */
+	LinphonePresenceActivityPerformance,
+
+	/** The person will not return for the foreseeable future, e.g., because it is no longer working for
+	 *  the company. */
+	LinphonePresenceActivityPermanentAbsence,
+
+	/** The person is occupying himself or herself in amusement, sport, or other recreation. */
+	LinphonePresenceActivityPlaying,
+
+	/** The person is giving a presentation, lecture, or participating in a formal round-table discussion. */
+	LinphonePresenceActivityPresentation,
+
+	/** The person is visiting stores in search of goods or services. */
+	LinphonePresenceActivityShopping,
+
+	/** The person is sleeping.*/
+	LinphonePresenceActivitySleeping,
+
+	/** The person is observing an event, such as a sports event. */
+	LinphonePresenceActivitySpectator,
+
+	/** The person is controlling a vehicle, watercraft, or plane. */
+	LinphonePresenceActivitySteering,
+
+	/** The person is on a business or personal trip, but not necessarily in-transit. */
+	LinphonePresenceActivityTravel,
+
+	/** The person is watching television. */
+	LinphonePresenceActivityTV,
+
+	/** The activity of the person is unknown. */
+	LinphonePresenceActivityUnknown,
+
+	/** A period of time devoted to pleasure, rest, or relaxation. */
+	LinphonePresenceActivityVacation,
+
+	/** The person is engaged in, typically paid, labor, as part of a profession or job. */
+	LinphonePresenceActivityWorking,
+
+	/** The person is participating in religious rites. */
+	LinphonePresenceActivityWorship
+} LinphonePresenceActivityType;
+
+/**
+ * Basic status as defined in section 4.1.4 of RFC 3863
+ * @ingroup buddy_list
+ */
+typedef enum LinphonePresenceBasicStatus {
+	/** This value means that the associated contact element, if any, is ready to accept communication. */
+	LinphonePresenceBasicStatusOpen,
+
+	/** This value means that the associated contact element, if any, is unable to accept communication. */
+	LinphonePresenceBasicStatusClosed
+} LinphonePresenceBasicStatus;
+
+/**
+ * Presence model type holding information about the presence of a person.
+ * @ingroup buddy_list
+ */
+typedef struct _LinphonePresenceModel LinphonePresenceModel;
+
+/**
+ * Presence note type holding information about a presence note.
+ * @ingroup buddy_list
+ */
+typedef struct _LinphonePresenceNote LinphonePresenceNote;
+
+/**
+ * Presence person holding information about a presence person.
+ * @ingroup buddy_list
+ */
+typedef struct _LinphonePresencePerson LinphonePresencePerson;
+
+/**
+ * Presence service type holding information about a presence service.
+ * @ingroup buddy_list
+ */
+typedef struct _LinphonePresenceService LinphonePresenceService;
+
+/**
+ * @ingroup call_control
+ * Defines privacy policy to apply as described by rfc3323
+**/
+typedef enum _LinphonePrivacy {
+	/**
+	 * Privacy services must not perform any privacy function
+	 */
+	LinphonePrivacyNone = 0x0,
+	/**
+	 * Request that privacy services provide a user-level privacy
+	 * function.
+	 * With this mode, "from" header is hidden, usually replaced by  From: "Anonymous" <sip:anonymous@anonymous.invalid>
+	 */
+	LinphonePrivacyUser = 0x1,
+	/**
+	 * Request that privacy services modify headers that cannot
+	 * be set arbitrarily by the user (Contact/Via).
+	 */
+	LinphonePrivacyHeader = 0x2,
+	/**
+	 *  Request that privacy services provide privacy for session
+	 * media
+	 */
+	LinphonePrivacySession = 0x4,
+	/**
+	 * rfc3325
+	 * The presence of this privacy type in
+	 * a Privacy header field indicates that the user would like the Network
+	 * Asserted Identity to be kept private with respect to SIP entities
+	 * outside the Trust Domain with which the user authenticated.  Note
+	 * that a user requesting multiple types of privacy MUST include all of
+	 * the requested privacy types in its Privacy header field value
+	 *
+	 */
+	LinphonePrivacyId = 0x8,
+	/**
+	 * Privacy service must perform the specified services or
+	 * fail the request
+	 *
+	 **/
+	LinphonePrivacyCritical = 0x10,
+
+	/**
+	 * Special keyword to use privacy as defined either globally or by proxy using linphone_proxy_config_set_privacy()
+	 */
+	LinphonePrivacyDefault = 0x8000,
+} LinphonePrivacy;
+/* WARNING This enum MUST be kept in sync with the SalPrivacy enum from sal.h */
+
+/**
+ * A mask of #LinphonePrivacy values
+ * @ingroup call_control
+ */
+typedef unsigned int LinphonePrivacyMask;
+
+/**
+ * The #LinphoneProxyConfig object represents a proxy configuration to be used
+ * by the #LinphoneCore object.
+ * Its fields must not be used directly in favour of the accessors methods.
+ * Once created and filled properly the #LinphoneProxyConfig can be given to
+ * #LinphoneCore with linphone_core_add_proxy_config().
+ * This will automatically triggers the registration, if enabled.
+ *
+ * The proxy configuration are persistent to restarts because they are saved
+ * in the configuration file. As a consequence, after linphone_core_new() there
+ * might already be a list of configured proxy that can be examined with
+ * linphone_core_get_proxy_config_list().
+ *
+ * The default proxy (see linphone_core_set_default_proxy() ) is the one of the list
+ * that is used by default for calls.
+ * @ingroup proxies
+**/
+typedef struct _LinphoneProxyConfig LinphoneProxyConfig;
+
+/**
+ * Enum for publish states.
+ * @ingroup event_api
+**/
+typedef enum _LinphonePublishState{
+	LinphonePublishNone, /**< Initial state, do not use */
+	LinphonePublishProgress, /**< An outgoing publish was created and submitted */
+	LinphonePublishOk, /**< Publish is accepted */
+	LinphonePublishError, /**< Publish encoutered an error, linphone_event_get_reason() gives reason code */
+	LinphonePublishExpiring, /**< Publish is about to expire, only sent if [sip]->refresh_generic_publish property is set to 0 */
+	LinphonePublishCleared /**< Event has been un published */
+} LinphonePublishState;
+
+/**
+ * Enum describing various failure reasons or contextual information for some events.
+ * @see linphone_call_get_reason()
+ * @see linphone_proxy_config_get_error()
+ * @see linphone_error_info_get_reason()
+ * @ingroup misc
+**/
+typedef enum _LinphoneReason{
+	LinphoneReasonNone, /**< No reason has been set by the core */
+	LinphoneReasonNoResponse, /**< No response received from remote */
+	LinphoneReasonForbidden, /**< Authentication failed due to bad credentials or resource forbidden */
+	LinphoneReasonDeclined, /**< The call has been declined */
+	LinphoneReasonNotFound, /**< Destination of the call was not found */
+	LinphoneReasonNotAnswered, /**< The call was not answered in time (request timeout) */
+	LinphoneReasonBusy, /**< Phone line was busy */
+	LinphoneReasonUnsupportedContent, /**< Unsupported content */
+	LinphoneReasonIOError, /**< Transport error: connection failures, disconnections etc... */
+	LinphoneReasonDoNotDisturb, /**< Do not disturb reason */
+	LinphoneReasonUnauthorized, /**< Operation is unauthorized because missing credential */
+	LinphoneReasonNotAcceptable, /**< Operation is rejected due to incompatible or unsupported media parameters */
+	LinphoneReasonNoMatch, /**< Operation could not be executed by server or remote client because it didn't have any context for it */
+	LinphoneReasonMovedPermanently, /**< Resource moved permanently */
+	LinphoneReasonGone, /**< Resource no longer exists */
+	LinphoneReasonTemporarilyUnavailable, /**< Temporarily unavailable */
+	LinphoneReasonAddressIncomplete, /**< Address incomplete */
+	LinphoneReasonNotImplemented, /**< Not implemented */
+	LinphoneReasonBadGateway, /**< Bad gateway */
+	LinphoneReasonServerTimeout, /**< Server timeout */
+	LinphoneReasonUnknown /**< Unknown reason */
+} LinphoneReason;
+
+#define LinphoneReasonBadCredentials LinphoneReasonForbidden
+
+/*for compatibility*/
+#define LinphoneReasonMedia LinphoneReasonUnsupportedContent
+
+/**
+ * #LinphoneRegistrationState describes proxy registration states.
+ * @ingroup proxies
+**/
+typedef enum _LinphoneRegistrationState {
+	LinphoneRegistrationNone, /**< Initial state for registrations */
+	LinphoneRegistrationProgress, /**< Registration is in progress */
+	LinphoneRegistrationOk,	/**< Registration is successful */
+	LinphoneRegistrationCleared, /**< Unregistration succeeded */
+	LinphoneRegistrationFailed	/**< Registration failed */
+} LinphoneRegistrationState;
+
+typedef struct _LinphoneRingtonePlayer LinphoneRingtonePlayer;
+
+/**
+ * Linphone core SIP transport ports.
+ * Special values #LC_SIP_TRANSPORT_RANDOM, #LC_SIP_TRANSPORT_RANDOM, #LC_SIP_TRANSPORT_DONTBIND can be used.
+ * Use with #linphone_core_set_sip_transports
+ * @deprecated
+ * @donotwrap
+ */
+typedef struct _LinphoneSipTransports {
+	int udp_port; /**< SIP/UDP port */
+	int tcp_port; /**< SIP/TCP port */
+	int dtls_port; /**< SIP/DTLS port */
+	int tls_port; /**< SIP/TLS port */
+} LinphoneSipTransports;
+
+/**
+ * Linphone core SIP transport ports.
+ * Special values #LC_SIP_TRANSPORT_RANDOM, #LC_SIP_TRANSPORT_RANDOM, #LC_SIP_TRANSPORT_DONTBIND can be used.
+ * Use with #linphone_core_set_sip_transports
+ * @ingroup initializing
+ */
+typedef struct _LinphoneTransports LinphoneTransports;
+
+/**
+ * Old name of #LinphoneSipTransports
+ * @deprecated
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED typedef struct _LinphoneSipTransports LCSipTransports;
+
+typedef struct _LinphoneSoundDaemon LinphoneSoundDaemon;
+
+/**
+ * Enum describing the stream types.
+ * @ingroup initializing
+**/
+typedef enum _LinphoneStreamType {
+	LinphoneStreamTypeAudio,
+	LinphoneStreamTypeVideo,
+	LinphoneStreamTypeText,
+	LinphoneStreamTypeUnknown /* WARNING: Make sure this value remains the last one in the list */
+} LinphoneStreamType;
+
+/**
+ * Enum controlling behavior for incoming subscription request.
+ * Use by linphone_friend_set_inc_subscribe_policy()
+ * @ingroup buddy_list
+ */
+typedef enum _LinphoneSubscribePolicy {
+	/**
+	 * Does not automatically accept an incoming subscription request.
+	 * This policy implies that a decision has to be taken for each incoming subscription request notified by callback LinphoneCoreVTable.new_subscription_requested
+	 */
+	LinphoneSPWait,
+	LinphoneSPDeny, /**< Rejects incoming subscription request */
+	LinphoneSPAccept /**< Automatically accepts a subscription request */
+} LinphoneSubscribePolicy;
+
+/**
+ * Enum for subscription direction (incoming or outgoing).
+ * @ingroup event_api
+**/
+typedef enum _LinphoneSubscriptionDir{
+	LinphoneSubscriptionIncoming, /**< Incoming subscription. */
+	LinphoneSubscriptionOutgoing, /**< Outgoing subscription. */
+	LinphoneSubscriptionInvalidDir /**< Invalid subscription direction. */
+} LinphoneSubscriptionDir;
+
+/**
+ * Enum for subscription states.
+ * #LinphoneSubscriptionTerminated and #LinphoneSubscriptionError are final states.
+ * @ingroup event_api
+**/
+typedef enum _LinphoneSubscriptionState{
+	LinphoneSubscriptionNone, /**< Initial state, should not be used */
+	LinphoneSubscriptionOutgoingProgress, /**< An outgoing subcription was sent */
+	LinphoneSubscriptionIncomingReceived, /**< An incoming subcription is received */
+	LinphoneSubscriptionPending, /**< Subscription is pending, waiting for user approval */
+	LinphoneSubscriptionActive, /**< Subscription is accepted */
+	LinphoneSubscriptionTerminated, /**< Subscription is terminated normally */
+	LinphoneSubscriptionError, /**< Subscription was terminated by an error, indicated by linphone_event_get_reason() */
+	LinphoneSubscriptionExpiring, /**< Subscription is about to expire, only sent if [sip]->refresh_generic_subscribe property is set to 0 */
+} LinphoneSubscriptionState;
+
+/**
+ * Enum listing frequent telephony tones.
+ * @ingroup misc
+**/
+typedef enum _LinphoneToneID {
+	LinphoneToneUndefined, /**< Not a tone */
+	LinphoneToneBusy, /**< Busy tone */
+	LinphoneToneCallWaiting, /** Call waiting tone */
+	LinphoneToneCallOnHold, /** Call on hold tone */
+	LinphoneToneCallLost /** Tone played when call is abruptly disconnected (media lost)*/
+} LinphoneToneID;
+
+/**
+ * Enum describing transport type for LinphoneAddress.
+ * @ingroup linphone_address
+**/
+typedef enum _LinphoneTransportType {
+	LinphoneTransportUdp,
+	LinphoneTransportTcp,
+	LinphoneTransportTls,
+	LinphoneTransportDtls
+} LinphoneTransportType;
+/* WARNING This enum MUST be kept in sync with the SalTransport enum from sal.h */
+
+/**
+ * Linphone tunnel object.
+ * @ingroup tunnel
+ */
+typedef struct _LinphoneTunnel LinphoneTunnel;
+
+/**
+ * @brief Tunnel settings.
+ * @ingroup tunnel
+ */
+typedef struct _LinphoneTunnelConfig LinphoneTunnelConfig;
+
+/**
+ * Enum describing the tunnel modes.
+ * @ingroup tunnel
+**/
+typedef enum _LinphoneTunnelMode {
+	LinphoneTunnelModeDisable, /**< The tunnel is disabled */
+	LinphoneTunnelModeEnable, /**< The tunnel is enabled */
+	LinphoneTunnelModeAuto /**< The tunnel is enabled automatically if it is required */
+} LinphoneTunnelMode;
+
+/**
+ * Enum describing uPnP states.
+ * @ingroup initializing
+**/
+typedef enum _LinphoneUpnpState {
+	LinphoneUpnpStateIdle, /**< uPnP is not activate */
+	LinphoneUpnpStatePending, /**< uPnP process is in progress */
+	LinphoneUpnpStateAdding, /**< Internal use: Only used by port binding */
+	LinphoneUpnpStateRemoving, /**< Internal use: Only used by port binding */
+	LinphoneUpnpStateNotAvailable, /**< uPnP is not available */
+	LinphoneUpnpStateOk, /**< uPnP is enabled */
+	LinphoneUpnpStateKo, /**< uPnP processing has failed */
+	LinphoneUpnpStateBlacklisted, /**< IGD router is blacklisted */
+} LinphoneUpnpState;
+
+/**
+ * The #LinphoneVcard object.
+ * @ingroup carddav_vcard
+ */
+typedef struct _LinphoneVcard LinphoneVcard;
+
+/**
+ * Enum describing the result of a version update check.
+ * @ingroup misc
+ */
+typedef enum _LinphoneVersionUpdateCheckResult {
+	LinphoneVersionUpdateCheckUpToDate,
+	LinphoneVersionUpdateCheckNewVersionAvailable,
+	LinphoneVersionUpdateCheckError
+} LinphoneVersionUpdateCheckResult;
+
+/**
+ * The #LinphoneVideoDefinition object represents a video definition, eg. its width and its height.
+ * @ingroup media_parameters
+ */
+typedef struct _LinphoneVideoDefinition LinphoneVideoDefinition;
+
+/**
+ * Structure describing policy regarding video streams establishments.
+ * @ingroup media_parameters
+ * @deprecated
+ * @donotwrap
+**/
+typedef struct _LinphoneVideoPolicy {
+	bool_t automatically_initiate; /**<Whether video shall be automatically proposed for outgoing calls.*/
+	bool_t automatically_accept; /**<Whether video shall be automatically accepted for incoming calls*/
+	bool_t unused[2];
+} LinphoneVideoPolicy;
+
+/**
+ * Structure describing policy regarding video streams establishments.
+ * @ingroup media_parameters
+**/
+typedef struct _LinphoneVideoActivationPolicy LinphoneVideoActivationPolicy;
+
+typedef struct LinphoneVideoSizeDef {
+	MSVideoSize vsize;
+	const char *name;
+} LinphoneVideoSizeDef;
+
+/**
+ * Old name of #LinphoneVideoSizeDef
+ * @deprecated
+ */
+typedef LinphoneVideoSizeDef MSVideoSizeDef;
+
+typedef enum _LinphoneWaitingState {
+	LinphoneWaitingStart,
+	LinphoneWaitingProgress,
+	LinphoneWaitingFinished
+} LinphoneWaitingState;
+
+/**
+* Enum describing the types of argument for LinphoneXmlRpcRequest.
+* @ingroup misc
+**/
+typedef enum _LinphoneXmlRpcArgType {
+	LinphoneXmlRpcArgNone,
+	LinphoneXmlRpcArgInt,
+	LinphoneXmlRpcArgString
+} LinphoneXmlRpcArgType;
+
+/**
+ * The #LinphoneXmlRpcRequest object representing a XML-RPC request to be sent.
+ * @ingroup misc
+**/
+typedef struct _LinphoneXmlRpcRequest LinphoneXmlRpcRequest;
+
+/**
+ * An object to handle the callbacks for handling the #LinphoneXmlRpcRequest operations.
+ * @ingroup misc
+**/
+typedef struct _LinphoneXmlRpcRequestCbs LinphoneXmlRpcRequestCbs;
+
+/**
+ * The #LinphoneXmlRpcSession object used to send XML-RPC requests and handle their responses.
+ * @ingroup misc
+**/
+typedef struct _LinphoneXmlRpcSession LinphoneXmlRpcSession;
+
+/**
+* Enum describing the status of a LinphoneXmlRpcRequest.
+* @ingroup misc
+**/
+typedef enum _LinphoneXmlRpcStatus {
+	LinphoneXmlRpcStatusPending,
+	LinphoneXmlRpcStatusOk,
+	LinphoneXmlRpcStatusFailed
+} LinphoneXmlRpcStatus;
+
+typedef struct _LsdPlayer LsdPlayer;
+
+/**
+ * Object representing an RTP payload type.
+ * @ingroup media_parameters
+ */
+typedef struct _LinphonePayloadType LinphonePayloadType;
+
+/**
+ * Structure describing a range of integers
+ * @ingroup misc
+ */
+typedef struct _LinphoneRange LinphoneRange;
+
+/**
+ * Status code returned by some functions to
+ * notify whether the execution has been succesfully
+ * done or not.
+ * @ingroup misc
+ */
+typedef int LinphoneStatus;
+
+/**
+ * Object representing a chain of protocol headers.
+ * It provides read/write access to the headers of the underlying protocol.
+ * @ingroup misc
+**/
+typedef struct _LinphoneHeaders LinphoneHeaders;
+
+#endif /* LINPHONE_TYPES_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/algorithm.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/algorithm.h"
new file mode 100644
index 0000000..3639a88
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/algorithm.h"
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_ALGORITHM_H_
+#define _L_ALGORITHM_H_
+
+#include <algorithm>
+
+#include "general.h"
+
+// =============================================================================
+
+// NOTE: Maybe use https://github.com/ericniebler/range-v3 one day?
+
+LINPHONE_BEGIN_NAMESPACE
+
+template<typename T, typename Value>
+typename T::const_iterator find (const T &container, const Value &value) {
+	return std::find(container.cbegin(), container.cend(), value);
+}
+
+template<typename T, typename Value>
+typename T::iterator find (T &container, const Value &value) {
+	return std::find(container.begin(), container.end(), value);
+}
+
+template<typename T, typename Predicate>
+typename T::const_iterator findIf (const T &container, Predicate predicate) {
+	return std::find_if(container.cbegin(), container.cend(), predicate);
+}
+
+template<typename T, typename Predicate>
+typename T::iterator findIf (T &container, Predicate predicate) {
+	return std::find_if(container.begin(), container.end(), predicate);
+}
+
+template<typename T, typename Value>
+bool removeFirst (T &container, const Value &value) {
+	auto it = find(container, value);
+	if (it != container.end()) {
+		container.erase(it);
+		return true;
+	}
+	return false;
+}
+
+template<typename T, typename Predicate>
+void removeIf (T &container, Predicate predicate) {
+	std::remove_if(container.begin(), container.end(), predicate);
+}
+
+LINPHONE_END_NAMESPACE
+
+#endif // ifndef _L_ALGORITHM_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/enum-generator.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/enum-generator.h"
new file mode 100644
index 0000000..3051444
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/enum-generator.h"
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_ENUM_GENERATOR_H_
+#define _L_ENUM_GENERATOR_H_
+
+#include "linphone/utils/magic-macros.h"
+
+// =============================================================================
+
+LINPHONE_BEGIN_NAMESPACE
+
+// -----------------------------------------------------------------------------
+// Low-level, do not call.
+// -----------------------------------------------------------------------------
+
+// Declare one enum value. `value` is optional, it can be generated.
+// It's useful to force value in the case of mask.
+#define L_DECLARE_ENUM_VALUE_1_ARG(NAME) NAME,
+#define L_DECLARE_ENUM_VALUE_2_ARGS(NAME, VALUE) NAME = VALUE,
+
+// Call the right macro. (With or without value.)
+#define L_DECLARE_ENUM_MACRO_CHOOSER(...) \
+	L_EXPAND(L_GET_ARG_3(__VA_ARGS__, L_DECLARE_ENUM_VALUE_2_ARGS, L_DECLARE_ENUM_VALUE_1_ARG))
+
+// Enum value declaration.
+#define L_DECLARE_ENUM_VALUE(...) \
+	L_EXPAND(L_DECLARE_ENUM_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__))
+
+#ifdef __cplusplus
+
+// `getEnumValue` helper.
+#define L_DECLARE_ENUM_VALUE_STR_CASE(ENUM_NAME, VALUE_NAME, ...) \
+	case ENUM_NAME::VALUE_NAME: return #ENUM_NAME "::" #VALUE_NAME;
+
+// Helper to get enum name.
+#define L_DECLARE_ENUM_NAME(NAME, ...) NAME,
+
+// Get names as string from enum values.
+#define L_GET_ENUM_VALUE_NAMES(VALUES) L_GET_HEAP(VALUES(L_DECLARE_ENUM_NAME))
+
+#endif
+
+// -----------------------------------------------------------------------------
+// Public API.
+// -----------------------------------------------------------------------------
+
+#ifdef __cplusplus
+
+#define L_DECLARE_ENUM(NAME, VALUES) \
+	enum class NAME { \
+		VALUES(L_DECLARE_ENUM_VALUE) \
+	}; \
+	friend constexpr const char *getEnumNameAsString (NAME) { \
+		return #NAME; \
+	} \
+	friend const char *getEnumValueAsString (const NAME &value) { \
+		switch (value) { \
+			L_APPLY_WITHOUT_COMMA(L_DECLARE_ENUM_VALUE_STR_CASE, NAME, L_GET_ENUM_VALUE_NAMES(VALUES)) \
+		} \
+		return ""; \
+	}
+
+template<typename T>
+inline char getEnumValueAsString (const T &) { return 0; }
+
+template<typename T>
+struct IsDefinedEnum {
+	enum { value = sizeof(getEnumValueAsString(std::declval<T>())) == sizeof(const char *) };
+};
+
+//Explicit conversion from enum type to underlying type
+template<typename T>
+constexpr auto to_integral(T e) -> typename std::underlying_type<T>::type
+{
+	return static_cast<typename std::underlying_type<T>::type>(e);
+}
+
+#define L_GET_ENUM_VALUE(VALUE)	to_integral(VALUE)
+
+#endif
+
+#define L_C_ENUM_PREFIX Linphone
+
+// TODO: This macro should be used but it is triggering a bug in doxygen that
+// has been fixed in the 1.8.8 version. See https://bugzilla.gnome.org/show_bug.cgi?id=731985
+// Meanwhile use 2 different macros.
+#if 0
+#define L_DECLARE_C_ENUM(NAME, VALUES) \
+	typedef enum L_CONCAT(_, L_CONCAT(L_C_ENUM_PREFIX, NAME)) { \
+		L_APPLY(L_CONCAT, L_CONCAT(L_C_ENUM_PREFIX, NAME), L_GET_HEAP(VALUES(L_DECLARE_ENUM_VALUE))) \
+	} L_CONCAT(L_C_ENUM_PREFIX, NAME)
+#else
+#define L_DECLARE_C_ENUM(NAME, VALUES) \
+	typedef enum L_CONCAT(_, L_CONCAT(L_C_ENUM_PREFIX, NAME)) { \
+		L_APPLY(L_CONCAT, L_CONCAT(L_C_ENUM_PREFIX, NAME), L_GET_HEAP(VALUES(L_DECLARE_ENUM_VALUE_1_ARG))) \
+	} L_CONCAT(L_C_ENUM_PREFIX, NAME)
+#define L_DECLARE_C_ENUM_FIXED_VALUES(NAME, VALUES) \
+	typedef enum L_CONCAT(_, L_CONCAT(L_C_ENUM_PREFIX, NAME)) { \
+		L_APPLY(L_CONCAT, L_CONCAT(L_C_ENUM_PREFIX, NAME), L_GET_HEAP(VALUES(L_DECLARE_ENUM_VALUE_2_ARGS))) \
+	} L_CONCAT(L_C_ENUM_PREFIX, NAME)
+#endif
+
+LINPHONE_END_NAMESPACE
+
+#endif // ifndef _L_ENUM_GENERATOR_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/enum-mask.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/enum-mask.h"
new file mode 100644
index 0000000..8415838
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/enum-mask.h"
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_ENUM_MASK_H_
+#define _L_ENUM_MASK_H_
+
+#include <initializer_list>
+
+#include "linphone/utils/general.h"
+
+// =============================================================================
+
+/*
+ * The purpose of this class seems to be able to manipulate flag values that are declared as part of an enum.
+ * The C++ compiler forbids OR/AND operator on enums, however this can be easily workaround by either not using enum for mask but constexpr
+ * or by doing a basic cast to unsigned int.
+ * There are below 130 hardly readable lines of code for class doing this, but ~operator doesn't work as expected.
+ * (just try a &= EnumValue; to convince). TODO: question the interest of keeping this class and switch to simple const unsigned int.
+ */
+LINPHONE_BEGIN_NAMESPACE
+
+template<typename T>
+class EnumMask {
+	static_assert(std::is_enum<T>::value, "EnumMask must be used with enum type. Logic no?");
+	static_assert(sizeof(T) <= sizeof(int), "EnumMask supports only int, short or char values.");
+
+public:
+	// EnumMask's type. Can be int or unsigned int.
+	// See: http://en.cppreference.com/w/cpp/types/underlying_type
+	typedef typename std::conditional<
+		std::is_signed<typename std::underlying_type<T>::type>::value, int, unsigned int
+	>::type StorageType;
+
+	constexpr EnumMask (int mask = 0) : mMask(StorageType(mask)) {}
+	constexpr EnumMask (T value) : mMask(StorageType(value)) {}
+	constexpr EnumMask (std::initializer_list<T> mask) : mMask(init(mask.begin(), mask.end())) {}
+
+	constexpr operator StorageType () const {
+		return mMask;
+	}
+
+	constexpr bool isSet (T value) const {
+		return isSet(StorageType(value));
+	}
+
+	inline EnumMask &set (T value) {
+		*this |= value;
+		return *this;
+	}
+
+	inline EnumMask &unset (T value) {
+		*this &= ~StorageType(value);
+		return *this;
+	}
+
+	constexpr bool operator! () const {
+		return !mMask;
+	}
+
+	inline EnumMask &operator&= (int mask) {
+		mMask &= mask;
+		return *this;
+	}
+
+	inline EnumMask &operator&= (unsigned int mask) {
+		mMask &= mask;
+		return *this;
+	}
+
+	inline EnumMask &operator&= (T mask) {
+		mMask &= StorageType(mask);
+		return *this;
+	}
+
+	inline EnumMask &operator|= (EnumMask mask) {
+		mMask |= mask.mMask;
+		return *this;
+	}
+
+	inline EnumMask &operator|= (T mask) {
+		mMask |= StorageType(mask);
+		return *this;
+	}
+
+	inline EnumMask &operator^= (EnumMask mask) {
+		mMask ^= mask.mMask;
+		return *this;
+	}
+
+	inline EnumMask &operator^= (T mask) {
+		mMask ^= StorageType(mask);
+		return *this;
+	}
+
+	constexpr EnumMask operator& (int mask) const {
+		return mMask & mask;
+	}
+
+	constexpr EnumMask operator& (unsigned int mask) const {
+		return mMask & mask;
+	}
+
+	constexpr EnumMask operator& (T mask) const {
+		return int(mMask & StorageType(mask));
+	}
+
+	constexpr EnumMask operator| (EnumMask mask) const {
+		return mMask | mask.mMask;
+	}
+
+	constexpr EnumMask operator| (T mask) const {
+		return int(mMask | StorageType(mask));
+	}
+
+	constexpr EnumMask operator^ (EnumMask mask) const {
+		return mMask ^ mask.mMask;
+	}
+
+	constexpr EnumMask operator^ (T mask) const {
+		return int(mMask ^ StorageType(mask));
+	}
+
+	constexpr EnumMask operator~ () const {
+		return ~mMask;
+	}
+
+private:
+	constexpr bool isSet (StorageType value) const {
+		return (mMask & value) == value && (value || mMask == 0);
+	}
+
+// GCC versions prior to 5.0 have issues with array-bounds.
+#if defined(__GNUC__) && (__GNUC__ < 5)
+	#pragma GCC diagnostic push
+	#pragma GCC diagnostic ignored "-Warray-bounds"
+#endif
+
+	static constexpr StorageType init (
+		typename std::initializer_list<T>::const_iterator begin,
+		typename std::initializer_list<T>::const_iterator end
+	) {
+		return begin != end ? (StorageType(*begin) | init(begin + 1, end)) : StorageType(0);
+	}
+
+#if defined(__GNUC__) && (__GNUC__ < 5)
+	#pragma GCC diagnostic pop
+#endif
+
+	StorageType mMask;
+};
+
+LINPHONE_END_NAMESPACE
+
+#endif // ifndef _L_ENUM_MASK_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/fs.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/fs.h"
new file mode 100644
index 0000000..43f64aa
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/fs.h"
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_FS_H_
+#define _L_FS_H_
+
+#include <string>
+
+#include "linphone/utils/general.h"
+
+// =============================================================================
+
+LINPHONE_BEGIN_NAMESPACE
+
+namespace Fs {
+	// Copy one file to other destination. Return true on success.
+	LINPHONE_PUBLIC bool copy (const std::string &srcPath, const std::string &destPath);
+}
+
+LINPHONE_END_NAMESPACE
+
+#endif // ifndef _L_FS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/general.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/general.h"
new file mode 100644
index 0000000..e0f4e74
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/general.h"
@@ -0,0 +1,330 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_GENERAL_H_
+#define _L_GENERAL_H_
+
+#ifdef __cplusplus
+	#include <memory>
+	#include <type_traits>
+#endif
+
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// Namespace.
+// -----------------------------------------------------------------------------
+
+#ifdef __cplusplus
+	#define LINPHONE_BEGIN_NAMESPACE namespace LinphonePrivate {
+	#define LINPHONE_END_NAMESPACE }
+#else
+	#define LINPHONE_BEGIN_NAMESPACE
+	#define LINPHONE_END_NAMESPACE
+#endif
+
+// -----------------------------------------------------------------------------
+
+LINPHONE_BEGIN_NAMESPACE
+
+// -----------------------------------------------------------------------------
+// Export.
+// -----------------------------------------------------------------------------
+
+#ifndef LINPHONE_PUBLIC
+	#if defined(_MSC_VER)
+		#ifdef LINPHONE_STATIC
+			#define LINPHONE_PUBLIC
+		#else
+			#ifdef LINPHONE_EXPORTS
+				#define LINPHONE_PUBLIC __declspec(dllexport)
+			#else
+				#define LINPHONE_PUBLIC __declspec(dllimport)
+			#endif
+		#endif
+	#else
+		#define LINPHONE_PUBLIC
+	#endif
+#endif
+
+#ifndef LINPHONE_DEPRECATED
+	#if defined(_MSC_VER)
+		#define LINPHONE_DEPRECATED __declspec(deprecated)
+	#else
+		#define LINPHONE_DEPRECATED __attribute__((deprecated))
+	#endif
+#endif
+
+// -----------------------------------------------------------------------------
+
+#ifdef __cplusplus
+
+// -----------------------------------------------------------------------------
+// Debug.
+// -----------------------------------------------------------------------------
+
+void lAssert (const char *condition, const char *file, int line);
+
+#ifdef DEBUG
+	#define L_ASSERT(CONDITION) ((CONDITION) ? static_cast<void>(0) : LinphonePrivate::lAssert(#CONDITION, __FILE__, __LINE__))
+#else
+	#define L_ASSERT(CONDITION) static_cast<void>(false && (CONDITION))
+#endif
+
+// -----------------------------------------------------------------------------
+// Optimization.
+// -----------------------------------------------------------------------------
+
+#ifndef _MSC_VER
+	#define L_LIKELY(EXPRESSION) __builtin_expect(static_cast<bool>(EXPRESSION), true)
+	#define L_UNLIKELY(EXPRESSION)  __builtin_expect(static_cast<bool>(EXPRESSION), false)
+#else
+	#define L_LIKELY(EXPRESSION) EXPRESSION
+	#define L_UNLIKELY(EXPRESSION) EXPRESSION
+#endif
+
+// -----------------------------------------------------------------------------
+// Misc.
+// -----------------------------------------------------------------------------
+
+// Define an integer version like: 0xXXYYZZ, XX=MAJOR, YY=MINOR, and ZZ=PATCH.
+constexpr unsigned int makeVersion (unsigned int major, unsigned int minor, unsigned int patch) {
+	return ((major << 16) | (minor << 8) | patch);
+}
+
+// Not available in C++11...
+template<typename T, typename... Args>
+std::unique_ptr<T> makeUnique(Args && ...args) {
+	return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
+}
+
+#define L_AUTO_RETURN(VALUE) -> decltype(VALUE) { return VALUE; }
+
+// -----------------------------------------------------------------------------
+// Class tools.
+// -----------------------------------------------------------------------------
+
+#define L_DISABLE_COPY(CLASS) \
+	CLASS (const CLASS &) = delete; \
+	CLASS &operator= (const CLASS &) = delete;
+
+// -----------------------------------------------------------------------------
+// PImpl tools.
+// -----------------------------------------------------------------------------
+
+class BaseObject;
+class BaseObjectPrivate;
+class ClonableObject;
+class ClonableObjectPrivate;
+class Object;
+class ObjectPrivate;
+
+namespace Private {
+	template<typename T>
+	using BetterPrivateAncestor = typename std::conditional<
+		std::is_base_of<BaseObject, T>::value,
+		BaseObject,
+		typename std::conditional<
+			std::is_base_of<ClonableObject, T>::value,
+			ClonableObject,
+			T
+		>::type
+	>::type;
+
+	// Generic public helper.
+	template<
+		typename R,
+		typename P,
+		typename C
+	>
+	constexpr R *getPublicHelper (P *object, const C *) {
+		return static_cast<R *>(object);
+	}
+
+	// Generic public helper. Deal with shared data.
+	template<
+		typename R,
+		typename P,
+		typename C
+	>
+	inline R *getPublicHelper (const P &objectSet, const C *) {
+		auto it = objectSet.cbegin();
+		L_ASSERT(it != objectSet.cend());
+		return static_cast<R *>(*it);
+	}
+
+	template<typename T, typename U>
+	struct AddConstMirror {
+		typedef U type;
+	};
+
+	template<typename T, typename U>
+	struct AddConstMirror<const T, U> {
+		typedef typename std::add_const<U>::type type;
+	};
+}
+
+#define L_INTERNAL_CHECK_OBJECT_INHERITANCE(CLASS) \
+	static_assert( \
+		!(std::is_base_of<BaseObject, CLASS>::value && std::is_base_of<ClonableObject, CLASS>::value), \
+		"Multiple inheritance between BaseObject and ClonableObject is not allowed." \
+	);
+
+#define L_INTERNAL_DECLARE_PRIVATE(CLASS) \
+	inline CLASS ## Private *getPrivate () { \
+		L_INTERNAL_CHECK_OBJECT_INHERITANCE(CLASS); \
+		using TypeAncestor = LinphonePrivate::Private::BetterPrivateAncestor<CLASS>; \
+		return reinterpret_cast<CLASS ## Private *>(TypeAncestor::mPrivate); \
+	} \
+	inline const CLASS ## Private *getPrivate () const { \
+		L_INTERNAL_CHECK_OBJECT_INHERITANCE(CLASS); \
+		using TypeAncestor = LinphonePrivate::Private::BetterPrivateAncestor<CLASS>; \
+		return reinterpret_cast<const CLASS ## Private *>(TypeAncestor::mPrivate); \
+	} \
+	friend class CLASS ## Private; \
+	friend class Wrapper;
+
+// Allows access to private internal data.
+// Gives a control to C Wrapper.
+#ifndef LINPHONE_TESTER
+	#define L_DECLARE_PRIVATE(CLASS) L_INTERNAL_DECLARE_PRIVATE(CLASS)
+#else
+	#define L_DECLARE_PRIVATE(CLASS) \
+		L_INTERNAL_DECLARE_PRIVATE(CLASS) \
+		friend class Tester;
+#endif
+
+#define L_DECLARE_PUBLIC(CLASS) \
+	CLASS *getPublic () { \
+		return LinphonePrivate::Private::getPublicHelper<CLASS>(mPublic, this); \
+	} \
+	const CLASS *getPublic () const { \
+		return LinphonePrivate::Private::getPublicHelper<const CLASS>(mPublic, this); \
+	} \
+	friend class CLASS;
+
+// Get Private data.
+#define L_D() decltype(getPrivate()) const d = getPrivate();
+
+// Get Public data.
+#define L_Q() decltype(getPublic()) const q = getPublic();
+
+// Get Private data of class in a multiple inheritance case.
+#define L_D_T(CLASS, NAME) \
+	auto const NAME = static_cast< \
+		LinphonePrivate::Private::AddConstMirror< \
+			std::remove_reference<decltype(*this)>::type, \
+			CLASS ## Private \
+		>::type * \
+	>(CLASS::mPrivate);
+
+// Get Public data of class in a multiple inheritance case.
+#define L_Q_T(CLASS, NAME) \
+	auto const NAME = static_cast< \
+		LinphonePrivate::Private::AddConstMirror< \
+			std::remove_reference<decltype(*this)>::type, \
+			CLASS \
+		>::type * \
+	>(getPublic());
+
+// -----------------------------------------------------------------------------
+// Overload.
+// -----------------------------------------------------------------------------
+
+#define L_OVERRIDE_SHARED_FROM_THIS(CLASS) \
+	inline std::shared_ptr<CLASS> getSharedFromThis () { \
+		return std::static_pointer_cast<CLASS>(Object::getSharedFromThis()); \
+	} \
+	inline std::shared_ptr<const CLASS> getSharedFromThis () const { \
+		return std::static_pointer_cast<const CLASS>(Object::getSharedFromThis()); \
+	}
+
+namespace Private {
+	template<typename... Args>
+	struct ResolveMemberFunctionOverload {
+		template<typename Ret, typename Obj>
+		constexpr auto operator() (Ret (Obj::*func)(Args...)) const L_AUTO_RETURN(func);
+	};
+
+	template<typename... Args>
+	struct ResolveConstMemberFunctionOverload {
+		template<typename Ret, typename Obj>
+		constexpr auto operator() (Ret (Obj::*func)(Args...) const) const L_AUTO_RETURN(func);
+	};
+
+	template<typename... Args>
+	struct ResolveOverload : ResolveMemberFunctionOverload<Args...>, ResolveConstMemberFunctionOverload<Args...> {
+		using ResolveMemberFunctionOverload<Args...>::operator();
+		using ResolveConstMemberFunctionOverload<Args...>::operator();
+
+		template<typename Ret>
+		constexpr auto operator() (Ret (*func)(Args...)) const L_AUTO_RETURN(func);
+	};
+}
+
+// Useful to select a specific overloaded function. (Avoid usage of static_cast.)
+template<typename... Args>
+using resolveOverload = Private::ResolveOverload<Args...>;
+
+// -----------------------------------------------------------------------------
+// Math.
+// -----------------------------------------------------------------------------
+
+// Get the length of one integer.
+constexpr int getIntLength (int n) {
+	return n < 0 ? 1 + getIntLength(-n) : (n < 10 ? 1 : 1 + getIntLength(n / 10));
+}
+
+namespace Private {
+	constexpr int pow10Impl (int n, int acc) {
+		return n == 0 ? acc : pow10Impl(n - 1, acc * 10);
+	}
+}
+
+template<typename T>
+constexpr T abs (const T &value) {
+	return value < 0 ? -value : value;
+}
+
+constexpr int pow10 (int n) {
+	return (n < 0 ? -1 : +1) * Private::pow10Impl(abs(n), 1);
+}
+
+// Returns the sum of n elements.
+constexpr int sums () {
+	return 0;
+}
+
+template<typename T, typename... Args>
+constexpr int sums (T i, Args... args) {
+	return i + sums(args...);
+}
+
+// -----------------------------------------------------------------------------
+// Wrapper public.
+// -----------------------------------------------------------------------------
+
+#define L_DECL_C_STRUCT(STRUCT) typedef struct _ ## STRUCT STRUCT;
+#define L_DECL_C_STRUCT_PREFIX_LESS(STRUCT) typedef struct STRUCT STRUCT;
+
+#endif // ifdef __cplusplus
+
+LINPHONE_END_NAMESPACE
+
+#endif // ifndef _L_GENERAL_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/magic-macros.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/magic-macros.h"
new file mode 100644
index 0000000..12c5685
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/magic-macros.h"
@@ -0,0 +1,290 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_MAGIC_MACROS_H_
+#define _L_MAGIC_MACROS_H_
+
+#include "linphone/utils/general.h"
+
+// =============================================================================
+
+LINPHONE_BEGIN_NAMESPACE
+
+// Concat in depth context.
+#define L_CONCAT__(A, B) A ## B
+#define L_CONCAT_(A, B) L_CONCAT__(A, B)
+#define L_CONCAT(A, B) L_CONCAT_(A, B)
+
+// Get argument numbers from variadic.
+#define L_ARG_N( \
+	A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, \
+	A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, N, ... \
+) N
+
+#define L_EXPAND(X) X
+
+// Useful in depth context.
+#define L_STRINGIFY(X) #X
+
+#define L_GET_N_ARGS(...) L_EXPAND(L_ARG_N( \
+	__VA_ARGS__, \
+	21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
+	9, 8, 7, 6, 5, 4, 3, 2, 1, 0 \
+))
+
+// Get argument numbers - 1 from variadic.
+#define L_GET_N_ARGS_SUB(X, ...) L_GET_N_ARGS(__VA_ARGS__)
+
+// Get argument from variadic macro.
+#define L_GET_ARG_1(A1, ...) A1
+#define L_GET_ARG_2(A1, A2, ...) A2
+#define L_GET_ARG_3(A1, A2, A3, ...) A3
+#define L_GET_ARG_4(A1, A2, A3, A4, ...) A4
+#define L_GET_ARG_5(A1, A2, A3, A4, A5, ...) A5
+#define L_GET_ARG_6(A1, A2, A3, A4, A5, A6, ...) A6
+#define L_GET_ARG_7(A1, A2, A3, A4, A5, A6, A7, ...) A7
+#define L_GET_ARG_8(A1, A2, A3, A4, A5, A6, A7, A8, ...) A8
+#define L_GET_ARG_9(A1, A2, A3, A4, A5, A6, A7, A8, A9, ...) A9
+#define L_GET_ARG_10(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, ...) A10
+#define L_GET_ARG_11(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, ...) A11
+#define L_GET_ARG_12(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, ...) A12
+#define L_GET_ARG_13(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, ...) A13
+#define L_GET_ARG_14(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, ...) A14
+#define L_GET_ARG_15(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, ...) A15
+#define L_GET_ARG_16(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, ...) A16
+#define L_GET_ARG_17(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, ...) A17
+#define L_GET_ARG_18(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, ...) A18
+#define L_GET_ARG_19(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, ...) A19
+#define L_GET_ARG_20(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, ...) A20
+#define L_GET_ARG_21(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, ...) A21
+
+// Get left part of variadic.
+#define L_GET_HEAP_1(A1, ...) A1
+#define L_GET_HEAP_2(A1, A2, ...) A1, A2
+#define L_GET_HEAP_3(A1, A2, A3, ...) A1, A2, A3
+#define L_GET_HEAP_4(A1, A2, A3, A4, ...) A1, A2, A3, A4
+#define L_GET_HEAP_5(A1, A2, A3, A4, A5, ...) A1, A2, A3, A4, A5
+#define L_GET_HEAP_6(A1, A2, A3, A4, A5, A6, ...) A1, A2, A3, A4, A5, A6
+#define L_GET_HEAP_7(A1, A2, A3, A4, A5, A6, A7, ...) A1, A2, A3, A4, A5, A6, A7
+#define L_GET_HEAP_8(A1, A2, A3, A4, A5, A6, A7, A8, ...) A1, A2, A3, A4, A5, A6, A7, A8
+#define L_GET_HEAP_9(A1, A2, A3, A4, A5, A6, A7, A8, A9, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9
+#define L_GET_HEAP_10(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10
+#define L_GET_HEAP_11(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11
+#define L_GET_HEAP_12(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12
+#define L_GET_HEAP_13(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13
+#define L_GET_HEAP_14(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14
+#define L_GET_HEAP_15(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15
+#define L_GET_HEAP_16(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16
+#define L_GET_HEAP_17(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17
+#define L_GET_HEAP_18(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18
+#define L_GET_HEAP_19(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19
+#define L_GET_HEAP_20(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20
+#define L_GET_HEAP_21(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, ...) A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21
+
+#define L_GET_HEAP(...) L_EXPAND( \
+	L_CONCAT(L_GET_HEAP_, L_GET_N_ARGS_SUB(__VA_ARGS__)) (__VA_ARGS__) \
+)
+
+// Call a macro on args.
+#define L_CALL(MACRO, ARGS) MACRO ARGS
+#define L_CALL_HELPER(MACRO, ARGS) MACRO ARGS
+
+// Map each variadic args.
+#define L_APPLY_1(MACRONAME, DATA, A1) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1))
+
+#define L_APPLY_2(MACRONAME, DATA, A1, A2) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_1(MACRONAME, DATA, A2)
+
+#define L_APPLY_3(MACRONAME, DATA, A1, A2, A3) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_2(MACRONAME, DATA, A2, A3)
+
+#define L_APPLY_4(MACRONAME, DATA, A1, A2, A3, A4) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_3(MACRONAME, DATA, A2, A3, A4)
+
+#define L_APPLY_5(MACRONAME, DATA, A1, A2, A3, A4, A5) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_4(MACRONAME, DATA, A2, A3, A4, A5)
+
+#define L_APPLY_6(MACRONAME, DATA, A1, A2, A3, A4, A5, A6) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_5(MACRONAME, DATA, A2, A3, A4, A5, A6)
+
+#define L_APPLY_7(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_6(MACRONAME, DATA, A2, A3, A4, A5, A6, A7)
+
+#define L_APPLY_8(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_7(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8)
+
+#define L_APPLY_9(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_8(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9)
+
+#define L_APPLY_10(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_9(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10)
+
+#define L_APPLY_11(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_10(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11)
+
+#define L_APPLY_12(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_11(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12)
+
+#define L_APPLY_13(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_12(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13)
+
+#define L_APPLY_14(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_13(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14)
+
+#define L_APPLY_15(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_14(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15)
+
+#define L_APPLY_16(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_15(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16)
+
+#define L_APPLY_17(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_16(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17)
+
+#define L_APPLY_18(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_17(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18)
+
+#define L_APPLY_19(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_18(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19)
+
+#define L_APPLY_20(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_19(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20)
+
+#define L_APPLY_21(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)), \
+	L_APPLY_20(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)
+
+#define L_APPLY(MACRONAME, DATA, ...) \
+	L_CALL( \
+		L_CONCAT(L_APPLY_, L_GET_N_ARGS(__VA_ARGS__)), \
+		(MACRONAME, DATA, __VA_ARGS__) \
+	)
+
+// Map each variadic args without comma separator.
+#define L_APPLY_WITHOUT_COMMA_1(MACRONAME, DATA, A1) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1))
+
+#define L_APPLY_WITHOUT_COMMA_2(MACRONAME, DATA, A1, A2) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_1(MACRONAME, DATA, A2)
+
+#define L_APPLY_WITHOUT_COMMA_3(MACRONAME, DATA, A1, A2, A3) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_2(MACRONAME, DATA, A2, A3)
+
+#define L_APPLY_WITHOUT_COMMA_4(MACRONAME, DATA, A1, A2, A3, A4) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_3(MACRONAME, DATA, A2, A3, A4)
+
+#define L_APPLY_WITHOUT_COMMA_5(MACRONAME, DATA, A1, A2, A3, A4, A5) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_4(MACRONAME, DATA, A2, A3, A4, A5)
+
+#define L_APPLY_WITHOUT_COMMA_6(MACRONAME, DATA, A1, A2, A3, A4, A5, A6) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_5(MACRONAME, DATA, A2, A3, A4, A5, A6)
+
+#define L_APPLY_WITHOUT_COMMA_7(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_6(MACRONAME, DATA, A2, A3, A4, A5, A6, A7)
+
+#define L_APPLY_WITHOUT_COMMA_8(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_7(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8)
+
+#define L_APPLY_WITHOUT_COMMA_9(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_8(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9)
+
+#define L_APPLY_WITHOUT_COMMA_10(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_9(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10)
+
+#define L_APPLY_WITHOUT_COMMA_11(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_10(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11)
+
+#define L_APPLY_WITHOUT_COMMA_12(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_11(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12)
+
+#define L_APPLY_WITHOUT_COMMA_13(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_12(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13)
+
+#define L_APPLY_WITHOUT_COMMA_14(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_13(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14)
+
+#define L_APPLY_WITHOUT_COMMA_15(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_14(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15)
+
+#define L_APPLY_WITHOUT_COMMA_16(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_15(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16)
+
+#define L_APPLY_WITHOUT_COMMA_17(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_16(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17)
+
+#define L_APPLY_WITHOUT_COMMA_18(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_17(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18)
+
+#define L_APPLY_WITHOUT_COMMA_19(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_18(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19)
+
+#define L_APPLY_WITHOUT_COMMA_20(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_19(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20)
+
+#define L_APPLY_WITHOUT_COMMA_21(MACRONAME, DATA, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21) \
+	L_CALL_HELPER(MACRONAME, (DATA, A1)) \
+	L_APPLY_WITHOUT_COMMA_20(MACRONAME, DATA, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21)
+
+#define L_APPLY_WITHOUT_COMMA(MACRONAME, DATA, ...) \
+	L_CALL( \
+		L_CONCAT(L_APPLY_WITHOUT_COMMA_, L_GET_N_ARGS(__VA_ARGS__)), \
+		(MACRONAME, DATA, __VA_ARGS__) \
+	)
+
+LINPHONE_END_NAMESPACE
+
+#endif // ifndef _L_MAGIC_MACROS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/traits.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/traits.h"
new file mode 100644
index 0000000..25bfe8a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/traits.h"
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_TRAITS_H_
+#define _L_TRAITS_H_
+
+#include "linphone/utils/general.h"
+
+// =============================================================================
+
+LINPHONE_BEGIN_NAMESPACE
+
+namespace Private {
+	// See: http://en.cppreference.com/w/cpp/types/void_t
+	template<typename... T> struct MakeVoid {
+		typedef void type;
+	};
+	template<typename... T>
+	using void_t = typename MakeVoid<T...>::type;
+
+	template<typename T, typename U = void>
+	struct IsMapContainerImpl : std::false_type {};
+
+	template<typename T>
+	struct IsMapContainerImpl<
+		T,
+		void_t<
+			typename T::key_type,
+			typename T::mapped_type,
+			decltype(std::declval<T&>()[std::declval<const typename T::key_type&>()])
+		>
+	> : std::true_type {};
+};
+
+// Check if a type is a std container like map, unordered_map...
+template<typename T>
+struct IsMapContainer : Private::IsMapContainerImpl<T>::type {};
+
+LINPHONE_END_NAMESPACE
+
+#endif // ifndef _L_TRAITS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/utils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/utils.h"
new file mode 100644
index 0000000..0bf5883
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/utils/utils.h"
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _L_UTILS_H_
+#define _L_UTILS_H_
+
+#include <ctime>
+#include <list>
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "linphone/utils/enum-generator.h"
+
+// =============================================================================
+
+LINPHONE_BEGIN_NAMESPACE
+
+namespace Utils {
+	template<typename T>
+	constexpr T *getPtr (std::shared_ptr<T> &object) {
+		return object.get();
+	}
+
+	template<typename T>
+	constexpr T *getPtr (const std::shared_ptr<T> &object) {
+		return object.get();
+	}
+
+	template<typename T>
+	constexpr T *getPtr (std::unique_ptr<T> &object) {
+		return object.get();
+	}
+
+	template<typename T>
+	constexpr T *getPtr (const std::unique_ptr<T> &object) {
+		return object.get();
+	}
+
+	template<typename T>
+	constexpr T *getPtr (T *object) {
+		return object;
+	}
+
+	template<typename T>
+	constexpr T *getPtr (T &object) {
+		return &object;
+	}
+
+	LINPHONE_PUBLIC bool iequals (const std::string &a, const std::string &b);
+
+	LINPHONE_PUBLIC std::vector<std::string> split (const std::string &str, const std::string &delimiter);
+
+	LINPHONE_PUBLIC inline std::vector<std::string> split (const std::string &str, char delimiter) {
+		return split(str, std::string(1, delimiter));
+	}
+
+	LINPHONE_PUBLIC std::string toString (int val);
+	LINPHONE_PUBLIC std::string toString (long val);
+	LINPHONE_PUBLIC std::string toString (long long val);
+	LINPHONE_PUBLIC std::string toString (unsigned val);
+	LINPHONE_PUBLIC std::string toString (unsigned long val);
+	LINPHONE_PUBLIC std::string toString (unsigned long long val);
+	LINPHONE_PUBLIC std::string toString (float val);
+	LINPHONE_PUBLIC std::string toString (double val);
+	LINPHONE_PUBLIC std::string toString (long double val);
+	LINPHONE_PUBLIC std::string toString (const void *val);
+
+	template<typename T, typename = typename std::enable_if<IsDefinedEnum<T>::value, T>::type>
+	LINPHONE_PUBLIC inline std::string toString (const T &val) { return getEnumValueAsString(val); }
+
+	LINPHONE_PUBLIC int stoi (const std::string &str, size_t *idx = 0, int base = 10);
+	LINPHONE_PUBLIC long long stoll (const std::string &str, size_t *idx = 0, int base = 10);
+	LINPHONE_PUBLIC unsigned long long stoull (const std::string &str, size_t *idx = 0, int base = 10);
+	LINPHONE_PUBLIC double stod (const std::string &str, size_t *idx = 0);
+	LINPHONE_PUBLIC float stof (const std::string &str, size_t *idx = 0);
+	LINPHONE_PUBLIC bool stob (const std::string &str);
+
+	LINPHONE_PUBLIC int stoi (const char *str, size_t *idx = 0, int base = 10);
+	LINPHONE_PUBLIC long long stoll (const char *str, size_t *idx = 0, int base = 10);
+	LINPHONE_PUBLIC unsigned long long stoull (const char *str, size_t *idx = 0, int base = 10);
+	LINPHONE_PUBLIC double stod (const char *str, size_t *idx = 0);
+	LINPHONE_PUBLIC float stof (const char *str, size_t *idx = 0);
+
+	LINPHONE_PUBLIC std::string stringToLower (const std::string &str);
+
+	LINPHONE_PUBLIC char *utf8ToChar (uint32_t ic);
+
+	LINPHONE_PUBLIC inline std::string cStringToCppString (const char *str) {
+		return str ? str : "";
+	}
+
+	template<typename S, typename T>
+	inline std::string join (const std::vector<T>& elems, const S& delim) {
+		std::stringstream ss;
+
+		for (auto e = elems.begin(); e != elems.end();) {
+			if (e != elems.end()) {
+				ss << *e;
+			}
+			if (++e != elems.end()) {
+				ss << delim;
+			}
+		}
+		return ss.str();
+	}
+	LINPHONE_PUBLIC std::string trim (const std::string &str);
+
+	template<typename T>
+	inline const T &getEmptyConstRefObject () {
+		static const T object{};
+		return object;
+	}
+
+	template<class Container>
+	inline std::vector<typename Container::value_type> toVector(const Container &l) {
+		std::vector<typename Container::value_type> v;
+		v.reserve(l.size());
+		std::copy(std::begin(l), std::end(l), std::back_inserter(v));
+		return v;
+	}
+
+	template<class Container>
+	inline std::list<typename Container::value_type> toList(const Container &l) {
+		std::list<typename Container::value_type> v;
+		std::copy(std::begin(l), std::end(l), std::back_inserter(v));
+		return v;
+	}
+
+	LINPHONE_PUBLIC std::tm getTimeTAsTm (time_t t);
+	LINPHONE_PUBLIC time_t getTmAsTimeT (const std::tm &t);
+
+	LINPHONE_PUBLIC std::string localeToUtf8 (const std::string &str);
+	LINPHONE_PUBLIC std::string utf8ToLocale (const std::string &str);
+	LINPHONE_PUBLIC std::string convertAnyToUtf8 (const std::string &str, const std::string &encoding);
+}
+
+LINPHONE_END_NAMESPACE
+
+#endif // ifndef _L_UTILS_H_
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/vcard.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/vcard.h"
new file mode 100644
index 0000000..6fc1c3d
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/vcard.h"
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_VCARD_H
+#define LINPHONE_VCARD_H
+
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+ * @addtogroup carddav_vcard
+ * @{
+ */
+
+/**
+ * Cast a belle_sip_object_t into LinphoneVcard.
+ */
+#define LINPHONE_VCARD BELLE_SIP_CAST(object, LinphoneVcard)
+
+/**
+ * Creates a #LinphoneVcard object that has a pointer to an empty vCard
+ * @return a new #LinphoneVcard object
+ * @deprecated Use linphone_factory_create_vcard() instead.
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC LinphoneVcard* linphone_vcard_new(void);
+
+/**
+ * Deletes a #LinphoneVcard object properly
+ * @param[in] vCard the #LinphoneVcard to destroy
+ * @deprecated Use linphone_vcard_unref() or belle_sip_object_unref() instead.
+ * @donotwrap
+ */
+LINPHONE_DEPRECATED LINPHONE_PUBLIC void linphone_vcard_free(LinphoneVcard *vCard);
+
+/**
+ * Take a ref on a #LinphoneVcard.
+ * @param[in] vCard #LinphoneVcard object
+ */
+LINPHONE_PUBLIC LinphoneVcard *linphone_vcard_ref(LinphoneVcard *vCard);
+
+/**
+ * Release a #LinphoneVcard.
+ * @param[in] vCard #LinphoneVcard object
+ */
+LINPHONE_PUBLIC void linphone_vcard_unref(LinphoneVcard *vCard);
+
+/**
+ * Clone a #LinphoneVcard.
+ * @param[in] vCard #LinphoneVcard object
+ * @return a new #LinphoneVcard object
+ */
+LINPHONE_PUBLIC LinphoneVcard *linphone_vcard_clone(const LinphoneVcard *vCard);
+
+/**
+ * Returns the vCard4 representation of the LinphoneVcard.
+ * @param[in] vCard the #LinphoneVcard
+ * @return a const char * that represents the vCard
+ */
+LINPHONE_PUBLIC const char* linphone_vcard_as_vcard4_string(LinphoneVcard *vCard);
+
+/**
+ * Sets the FN attribute of the vCard (which is mandatory).
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] name the display name to set for the vCard
+ */
+LINPHONE_PUBLIC void linphone_vcard_set_full_name(LinphoneVcard *vCard, const char *name);
+
+/**
+ * Returns the FN attribute of the vCard, or NULL if it isn't set yet.
+ * @param[in] vCard the #LinphoneVcard
+ * @return the display name of the vCard, or NULL
+ */
+LINPHONE_PUBLIC const char* linphone_vcard_get_full_name(const LinphoneVcard *vCard);
+
+/**
+ * Sets the skipFieldValidation property of the vcard
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] skip skipFieldValidation property of the vcard
+ */
+LINPHONE_PUBLIC void linphone_vcard_set_skip_validation(LinphoneVcard *vCard, bool_t skip);
+
+/**
+ * Returns the skipFieldValidation property of the vcard.
+ * @param[in] vCard the #LinphoneVcard
+ * @return the skipFieldValidation property of the vcard
+ */
+LINPHONE_PUBLIC bool_t linphone_vcard_get_skip_validation(const LinphoneVcard *vCard);
+
+/**
+ * Sets the family name in the N attribute of the vCard.
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] name the family name to set for the vCard
+ */
+LINPHONE_PUBLIC void linphone_vcard_set_family_name(LinphoneVcard *vCard, const char *name);
+
+/**
+ * Returns the family name in the N attribute of the vCard, or NULL if it isn't set yet.
+ * @param[in] vCard the #LinphoneVcard
+ * @return the family name of the vCard, or NULL
+ */
+LINPHONE_PUBLIC const char* linphone_vcard_get_family_name(const LinphoneVcard *vCard);
+
+/**
+ * Sets the given name in the N attribute of the vCard.
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] name the given name to set for the vCard
+ */
+LINPHONE_PUBLIC void linphone_vcard_set_given_name(LinphoneVcard *vCard, const char *name);
+
+/**
+ * Returns the given name in the N attribute of the vCard, or NULL if it isn't set yet.
+ * @param[in] vCard the #LinphoneVcard
+ * @return the given name of the vCard, or NULL
+ */
+LINPHONE_PUBLIC const char* linphone_vcard_get_given_name(const LinphoneVcard *vCard);
+
+/**
+ * Adds a SIP address in the vCard, using the IMPP property
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] sip_address the SIP address to add
+ */
+LINPHONE_PUBLIC void linphone_vcard_add_sip_address(LinphoneVcard *vCard, const char *sip_address);
+
+/**
+ * Removes a SIP address in the vCard (if it exists), using the IMPP property
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] sip_address the SIP address to remove
+ */
+LINPHONE_PUBLIC void linphone_vcard_remove_sip_address(LinphoneVcard *vCard, const char *sip_address);
+
+/**
+ * Edits the preferred SIP address in the vCard (or the first one), using the IMPP property
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] sip_address the new SIP address
+ */
+LINPHONE_PUBLIC void linphone_vcard_edit_main_sip_address(LinphoneVcard *vCard, const char *sip_address);
+
+/**
+ * Returns the list of SIP addresses (as LinphoneAddress) in the vCard (all the IMPP attributes that has an URI value starting by "sip:") or NULL
+ * @param[in] vCard the #LinphoneVcard
+ * @return \bctbx_list{LinphoneAddress}
+ */
+LINPHONE_PUBLIC const bctbx_list_t* linphone_vcard_get_sip_addresses(LinphoneVcard *vCard);
+
+/**
+ * Adds a phone number in the vCard, using the TEL property
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] phone the phone number to add
+ */
+LINPHONE_PUBLIC void linphone_vcard_add_phone_number(LinphoneVcard *vCard, const char *phone);
+
+/**
+ * Removes a phone number in the vCard (if it exists), using the TEL property
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] phone the phone number to remove
+ */
+LINPHONE_PUBLIC void linphone_vcard_remove_phone_number(LinphoneVcard *vCard, const char *phone);
+
+/**
+ * Returns the list of phone numbers (as string) in the vCard (all the TEL attributes) or NULL
+ * @param[in] vCard the #LinphoneVcard
+ * @return \bctbx_list{const char *}
+ */
+LINPHONE_PUBLIC bctbx_list_t* linphone_vcard_get_phone_numbers(const LinphoneVcard *vCard);
+
+/**
+ * Fills the Organization field of the vCard
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] organization the Organization
+ */
+LINPHONE_PUBLIC void linphone_vcard_set_organization(LinphoneVcard *vCard, const char *organization);
+
+/**
+ * Gets the Organization of the vCard
+ * @param[in] vCard the #LinphoneVcard
+ * @return the Organization of the vCard or NULL
+ */
+LINPHONE_PUBLIC const char* linphone_vcard_get_organization(const LinphoneVcard *vCard);
+
+/**
+ * Generates a random unique id for the vCard.
+ * If is required to be able to synchronize the vCard with a CardDAV server
+ * @param[in] vCard the #LinphoneVcard
+ * @return TRUE if operation is successful, otherwise FALSE (for example if it already has an unique ID)
+ */
+LINPHONE_PUBLIC bool_t linphone_vcard_generate_unique_id(LinphoneVcard *vCard);
+
+/**
+ * Sets the unique ID of the vCard
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] uid the unique id
+ */
+LINPHONE_PUBLIC void linphone_vcard_set_uid(LinphoneVcard *vCard, const char *uid);
+
+/**
+ * Gets the UID of the vCard
+ * @param[in] vCard the #LinphoneVcard
+ * @return the UID of the vCard, otherwise NULL
+ */
+LINPHONE_PUBLIC const char* linphone_vcard_get_uid(const LinphoneVcard *vCard);
+
+/**
+ * Sets the eTAG of the vCard
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] etag the eTAG
+ */
+LINPHONE_PUBLIC void linphone_vcard_set_etag(LinphoneVcard *vCard, const char * etag);
+
+/**
+ * Gets the eTag of the vCard
+ * @param[in] vCard the #LinphoneVcard
+ * @return the eTag of the vCard in the CardDAV server, otherwise NULL
+ */
+LINPHONE_PUBLIC const char* linphone_vcard_get_etag(const LinphoneVcard *vCard);
+
+/**
+ * Sets the URL of the vCard
+ * @param[in] vCard the #LinphoneVcard
+ * @param[in] url the URL
+ */
+LINPHONE_PUBLIC void linphone_vcard_set_url(LinphoneVcard *vCard, const char *url);
+
+/**
+ * Gets the URL of the vCard
+ * @param[in] vCard the #LinphoneVcard
+ * @return the URL of the vCard in the CardDAV server, otherwise NULL
+ */
+LINPHONE_PUBLIC const char* linphone_vcard_get_url(const LinphoneVcard *vCard);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/video_definition.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/video_definition.h"
new file mode 100644
index 0000000..54c09d5
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/video_definition.h"
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_VIDEO_DEFINITION_H_
+#define LINPHONE_VIDEO_DEFINITION_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup media_parameters
+ * @{
+ */
+
+/**
+ * Acquire a reference to the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object.
+ * @return The same #LinphoneVideoDefinition object.
+**/
+LINPHONE_PUBLIC LinphoneVideoDefinition * linphone_video_definition_ref(LinphoneVideoDefinition *vdef);
+
+/**
+ * Release reference to the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object.
+**/
+LINPHONE_PUBLIC void linphone_video_definition_unref(LinphoneVideoDefinition *vdef);
+
+/**
+ * Retrieve the user pointer associated with the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object.
+ * @return The user pointer associated with the video definition.
+**/
+LINPHONE_PUBLIC void *linphone_video_definition_get_user_data(const LinphoneVideoDefinition *vdef);
+
+/**
+ * Assign a user pointer to the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object.
+ * @param[in] ud The user pointer to associate with the video definition.
+**/
+LINPHONE_PUBLIC void linphone_video_definition_set_user_data(LinphoneVideoDefinition *vdef, void *ud);
+
+/**
+ * Clone a video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object to be cloned
+ * @return The new clone of the video definition
+ */
+LINPHONE_PUBLIC LinphoneVideoDefinition * linphone_video_definition_clone(const LinphoneVideoDefinition *vdef);
+
+/**
+ * Get the width of the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @return The width of the video definition
+ */
+LINPHONE_PUBLIC unsigned int linphone_video_definition_get_width(const LinphoneVideoDefinition *vdef);
+
+/**
+ * Set the width of the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @param[in] width The width of the video definition
+ */
+LINPHONE_PUBLIC void linphone_video_definition_set_width(LinphoneVideoDefinition *vdef, unsigned int width);
+
+/**
+ * Get the height of the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @return The height of the video definition
+ */
+LINPHONE_PUBLIC unsigned int linphone_video_definition_get_height(const LinphoneVideoDefinition *vdef);
+
+/**
+ * Set the height of the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @param[in] height The height of the video definition
+ */
+LINPHONE_PUBLIC void linphone_video_definition_set_height(LinphoneVideoDefinition *vdef, unsigned int height);
+
+/**
+ * Set the width and the height of the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @param[in] width The width of the video definition
+ * @param[in] height The height of the video definition
+ */
+LINPHONE_PUBLIC void linphone_video_definition_set_definition(LinphoneVideoDefinition *vdef, unsigned int width, unsigned int height);
+
+/**
+ * Get the name of the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @return The name of the video definition
+ */
+LINPHONE_PUBLIC const char * linphone_video_definition_get_name(const LinphoneVideoDefinition *vdef);
+
+/**
+ * Set the name of the video definition.
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @param[in] name The name of the video definition
+ */
+LINPHONE_PUBLIC void linphone_video_definition_set_name(LinphoneVideoDefinition *vdef, const char *name);
+
+/**
+ * Tells whether two #LinphoneVideoDefinition objects are equal (the widths and the heights are the same but can be switched).
+ * @param[in] vdef1 #LinphoneVideoDefinition object
+ * @param[in] vdef2 #LinphoneVideoDefinition object
+ * @return A boolean value telling whether the two #LinphoneVideoDefinition objects are equal.
+ */
+LINPHONE_PUBLIC bool_t linphone_video_definition_equals(const LinphoneVideoDefinition *vdef1, const LinphoneVideoDefinition *vdef2);
+
+/**
+ * Tells whether two #LinphoneVideoDefinition objects are strictly equal (the widths are the same and the heights are the same).
+ * @param[in] vdef1 #LinphoneVideoDefinition object
+ * @param[in] vdef2 #LinphoneVideoDefinition object
+ * @return A boolean value telling whether the two #LinphoneVideoDefinition objects are strictly equal.
+ */
+LINPHONE_PUBLIC bool_t linphone_video_definition_strict_equals(const LinphoneVideoDefinition *vdef1, const LinphoneVideoDefinition *vdef2);
+
+/**
+ * Tells whether a #LinphoneVideoDefinition is undefined.
+ * @param[in] vdef #LinphoneVideoDefinition object
+ * @return A boolean value telling whether the #LinphoneVideoDefinition is undefined.
+ */
+LINPHONE_PUBLIC bool_t linphone_video_definition_is_undefined(const LinphoneVideoDefinition *vdef);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_VIDEO_DEFINITION_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/wrapper_utils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/wrapper_utils.h"
new file mode 100644
index 0000000..320a20f
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/wrapper_utils.h"
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * That file declares functions that are used by automatic API wrapper generators. These
+ * should not be used by C API users.
+ */
+
+#ifndef _WRAPPER_UTILS_H
+#define _WRAPPER_UTILS_H
+
+#include <bctoolbox/list.h>
+#include "linphone/defs.h"
+#include "linphone/types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup wrapper
+ * @{
+ */
+
+/**
+ * @brief Gets the list of listener in the core.
+ * @param lc The #LinphoneCore.
+ * @return The list of #LinphoneCoreCbs.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC bctbx_list_t *linphone_core_get_callbacks_list(const LinphoneCore *lc);
+
+/**
+ * @brief Gets the list of listener in the call.
+ * @param[in] call #LinphoneCall object.
+ * @return The list of #LinphoneCallCbs.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC const bctbx_list_t *linphone_call_get_callbacks_list(const LinphoneCall *call);
+
+/**
+ * @brief Gets the list of listener in the chat room.
+ * @param[in] cr #LinphoneChatRoom object.
+ * @return The list of #LinphoneChatRoomCbs.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC const bctbx_list_t *linphone_chat_room_get_callbacks_list(const LinphoneChatRoom *cr);
+
+/**
+ * Sets the current LinphoneChatRoomCbs.
+ * @param[in] cr LinphoneChatRoom object
+ * @param[in] cbs LinphoneChatRoomCbs object
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void linphone_chat_room_set_current_callbacks(LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs);
+
+/**
+ * @brief Gets the list of listener in the chat mesasge.
+ * @param[in] msg #LinphoneChatMessage object.
+ * @return The list of #LinphoneChatMessageCbs.
+ * @donotwrap
+ */
+LINPHONE_PUBLIC const bctbx_list_t *linphone_chat_message_get_callbacks_list(const LinphoneChatMessage *msg);
+
+/**
+ * Sets the current LinphoneChatMessageCbs.
+ * @param[in] msg LinphoneChatMessage object
+ * @param[in] cbs LinphoneChatMessageCbs object
+ * @donotwrap
+ */
+LINPHONE_PUBLIC void linphone_chat_message_set_current_callbacks(LinphoneChatMessage *msg, LinphoneChatMessageCbs *cbs);
+
+/**
+ * Send a message to peer member of this chat room.
+ *
+ * The state of the sending message will be notified via the callbacks defined in the #LinphoneChatMessageCbs object that can be obtained
+ * by calling linphone_chat_message_get_callbacks().
+ * @note Unlike linphone_chat_room_send_chat_message(), that function only takes a reference on the #LinphoneChatMessage
+ * instead of totaly takes ownership on it. Thus, the #LinphoneChatMessage object must be released by the API user after calling
+ * that function.
+ *
+ * @param[in] cr A chat room.
+ * @param[in] msg The message to send.
+ */
+LINPHONE_PUBLIC void linphone_chat_room_send_chat_message_2(LinphoneChatRoom *cr, LinphoneChatMessage *msg);
+
+/**
+ * Resend a chat message if it is in the 'not delivered' state for whatever reason.
+ * @note Unlike linphone_chat_message_resend(), that function only takes a reference on the #LinphoneChatMessage
+ * instead of totaly takes ownership on it. Thus, the #LinphoneChatMessage object must be released by the API user after calling
+ * that function.
+ *
+ * @param[in] msg #LinphoneChatMessage object
+ */
+LINPHONE_PUBLIC void linphone_chat_message_resend_2(LinphoneChatMessage *msg);
+
+/**
+ * Accessor for the shared_ptr&lt;BelCard&gt; stored by a #LinphoneVcard
+ */
+LINPHONE_PUBLIC void *linphone_vcard_get_belcard(LinphoneVcard *vcard);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // _WRAPPER_UTILS_H
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/xmlrpc.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/xmlrpc.h"
new file mode 100644
index 0000000..188af93
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Headers/xmlrpc.h"
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of Liblinphone.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef LINPHONE_XMLRPC_H_
+#define LINPHONE_XMLRPC_H_
+
+
+#include "linphone/types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @addtogroup misc
+ * @{
+ */
+
+/**
+ * Create a new #LinphoneXmlRpcRequest object.
+ * @param[in] return_type The expected XML-RPC response type.
+ * @param[in] method The XML-RPC method to call.
+ * @return A new #LinphoneXmlRpcRequest object.
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcRequest * linphone_xml_rpc_request_new(LinphoneXmlRpcArgType return_type, const char *method);
+
+/**
+ * Acquire a reference to the XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+ * @return The same #LinphoneXmlRpcRequest object.
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcRequest * linphone_xml_rpc_request_ref(LinphoneXmlRpcRequest *request);
+
+/**
+ * Release reference to the XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_unref(LinphoneXmlRpcRequest *request);
+
+/**
+ * Retrieve the user pointer associated with the XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+ * @return The user pointer associated with the XML-RPC request.
+**/
+LINPHONE_PUBLIC void *linphone_xml_rpc_request_get_user_data(const LinphoneXmlRpcRequest *request);
+
+/**
+ * Assign a user pointer to the XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+ * @param[in] ud The user pointer to associate with the XML-RPC request.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_set_user_data(LinphoneXmlRpcRequest *request, void *ud);
+
+/**
+ * Add an integer argument to an XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+ * @param[in] value The integer value of the added argument.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_add_int_arg(LinphoneXmlRpcRequest *request, int value);
+
+/**
+ * Add a string argument to an XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+ * @param[in] value The string value of the added argument.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_add_string_arg(LinphoneXmlRpcRequest *request, const char *value);
+
+/**
+ * Get the #LinphoneXmlRpcRequestCbs object associated with a LinphoneXmlRpcRequest.
+ * @param[in] request #LinphoneXmlRpcRequest object
+ * @return The #LinphoneXmlRpcRequestCbs object associated with the LinphoneXmlRpcRequest.
+ * @deprecated use add_callbacks / remove_callbacks instead
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcRequestCbs * linphone_xml_rpc_request_get_callbacks(const LinphoneXmlRpcRequest *request);
+
+/**
+ * Add the current #LinphoneXmlRpcRequestCbs object to a LinphoneXmlRpcRequest.
+ * @param[in] request #LinphoneXmlRpcRequest object
+ * @param[in] cbs The #LinphoneXmlRpcRequestCbs object to add to the LinphoneXmlRpcRequest.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_add_callbacks(LinphoneXmlRpcRequest *request, LinphoneXmlRpcRequestCbs *cbs);
+
+/**
+ * Remove the current #LinphoneXmlRpcRequestCbs object from a LinphoneXmlRpcRequest.
+ * @param[in] request #LinphoneXmlRpcRequest object
+ * @param[in] cbs The #LinphoneXmlRpcRequestCbs object to remove from the LinphoneXmlRpcRequest.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_remove_callbacks(LinphoneXmlRpcRequest *request, LinphoneXmlRpcRequestCbs *cbs);
+
+/**
+ * Get the current #LinphoneXmlRpcRequestCbs object associated with a LinphoneXmlRpcRequest.
+ * @param[in] request #LinphoneXmlRpcRequest object
+ * @return The current #LinphoneXmlRpcRequestCbs object associated with the LinphoneXmlRpcRequest.
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcRequestCbs *linphone_xml_rpc_request_get_current_callbacks(const LinphoneXmlRpcRequest *request);
+
+/**
+ * Get the content of the XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+ * @return The string representation of the content of the XML-RPC request.
+ */
+LINPHONE_PUBLIC const char * linphone_xml_rpc_request_get_content(const LinphoneXmlRpcRequest *request);
+
+/**
+ * Get the status of the XML-RPC request.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+ * @return The status of the XML-RPC request.
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcStatus linphone_xml_rpc_request_get_status(const LinphoneXmlRpcRequest *request);
+
+/**
+ * Get the response to an XML-RPC request sent with linphone_xml_rpc_session_send_request() and returning an integer response.
+ * @param[in] request #LinphoneXmlRpcRequest object.
+ * @return The integer response to the XML-RPC request.
+**/
+LINPHONE_PUBLIC int linphone_xml_rpc_request_get_int_response(const LinphoneXmlRpcRequest *request);
+
+/**
+* Get the response to an XML-RPC request sent with linphone_xml_rpc_session_send_request() and returning a string response.
+* @param[in] request LinphoneXmlRpcRequest object.
+* @return The string response to the XML-RPC request.
+**/
+LINPHONE_PUBLIC const char * linphone_xml_rpc_request_get_string_response(const LinphoneXmlRpcRequest *request);
+
+/**
+ * Create a new #LinphoneXmlRpcSession object.
+ * @param[in] core The #LinphoneCore object used to send the XML-RPC requests.
+ * @param[in] url The URL of the XML-RPC server to send the XML-RPC requests to.
+ * @return A new #LinphoneXmlRpcSession object.
+ */
+LINPHONE_PUBLIC LinphoneXmlRpcSession * linphone_xml_rpc_session_new(LinphoneCore *core, const char *url);
+
+/**
+ * Acquire a reference to the XML-RPC session.
+ * @param[in] session #LinphoneXmlRpcSession object.
+ * @return The same #LinphoneXmlRpcSession object.
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcSession * linphone_xml_rpc_session_ref(LinphoneXmlRpcSession *session);
+
+/**
+ * Release reference to the XML-RPC session.
+ * @param[in] session #LinphoneXmlRpcSession object.
+ * @warning This will not stop pending xml-rpc requests. Use linphone_xml_rpc_session_release() instead if this is intended.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_session_unref(LinphoneXmlRpcSession *session);
+
+/**
+ * Retrieve the user pointer associated with the XML-RPC session.
+ * @param[in] session #LinphoneXmlRpcSession object.
+ * @return The user pointer associated with the XML-RPC session.
+**/
+LINPHONE_PUBLIC void *linphone_xml_rpc_session_get_user_data(const LinphoneXmlRpcSession *session);
+
+/**
+ * Assign a user pointer to the XML-RPC session.
+ * @param[in] session #LinphoneXmlRpcSession object.
+ * @param[in] ud The user pointer to associate with the XML-RPC session.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_session_set_user_data(LinphoneXmlRpcSession *session, void *ud);
+
+/**
+ * Send an XML-RPC request.
+ * @param[in] session #LinphoneXmlRpcSession object.
+ * @param[in] request The #LinphoneXmlRpcRequest to be sent.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_session_send_request(LinphoneXmlRpcSession *session, LinphoneXmlRpcRequest *request);
+
+/**
+ * Stop and unref an XML rpc session. Pending requests will be aborted.
+ * @param[in] session #LinphoneXmlRpcSession object.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_session_release(LinphoneXmlRpcSession *session);
+
+/**
+ * Acquire a reference to a #LinphoneXmlRpcRequestCbs object.
+ * @param[in] cbs #LinphoneXmlRpcRequestCbs object.
+ * @return The same #LinphoneXmlRpcRequestCbs object.
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcRequestCbs * linphone_xml_rpc_request_cbs_ref(LinphoneXmlRpcRequestCbs *cbs);
+
+/**
+ * Release a reference to a #LinphoneXmlRpcRequestCbs object.
+ * @param[in] cbs #LinphoneXmlRpcRequestCbs object.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_cbs_unref(LinphoneXmlRpcRequestCbs *cbs);
+
+/**
+ * Retrieve the user pointer associated with a #LinphoneXmlRpcRequestCbs object.
+ * @param[in] cbs #LinphoneXmlRpcRequestCbs object.
+ * @return The user pointer associated with the #LinphoneXmlRpcRequestCbs object.
+**/
+LINPHONE_PUBLIC void *linphone_xml_rpc_request_cbs_get_user_data(const LinphoneXmlRpcRequestCbs *cbs);
+
+/**
+ * Assign a user pointer to a #LinphoneXmlRpcRequestCbs object.
+ * @param[in] cbs #LinphoneXmlRpcRequestCbs object.
+ * @param[in] ud The user pointer to associate with the #LinphoneXmlRpcRequestCbs object.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_cbs_set_user_data(LinphoneXmlRpcRequestCbs *cbs, void *ud);
+
+/**
+ * Get the response callback.
+ * @param[in] cbs #LinphoneXmlRpcRequestCbs object.
+ * @return The current response callback.
+**/
+LINPHONE_PUBLIC LinphoneXmlRpcRequestCbsResponseCb linphone_xml_rpc_request_cbs_get_response(const LinphoneXmlRpcRequestCbs *cbs);
+
+/**
+ * Set the response callback.
+ * @param[in] cbs #LinphoneXmlRpcRequestCbs object.
+ * @param[in] cb The response callback to be used.
+**/
+LINPHONE_PUBLIC void linphone_xml_rpc_request_cbs_set_response(LinphoneXmlRpcRequestCbs *cbs, LinphoneXmlRpcRequestCbsResponseCb cb);
+
+/**
+ * Creates a #LinphoneXmlRpcRequest from a #LinphoneXmlRpcSession
+ * @param[in] session the #LinphoneXmlRpcSession
+ * @param[in] return_type the return type of the request as a #LinphoneXmlRpcArgType
+ * @param[in] method the function name to call
+ * @return a #LinphoneXmlRpcRequest object
+ */
+LINPHONE_PUBLIC LinphoneXmlRpcRequest * linphone_xml_rpc_session_create_request(LinphoneXmlRpcSession *session, LinphoneXmlRpcArgType return_type, const char *method);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LINPHONE_XMLRPC_H_ */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Info.plist"
new file mode 100755
index 0000000..fbcd1c7
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Modules/module.modulemap" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Modules/module.modulemap"
new file mode 100755
index 0000000..63f5ce3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Modules/module.modulemap"
@@ -0,0 +1,16 @@
+// This file goes to the linphone.framework, and is required for the linphonesw.framework (swift wrapper) 
+// to work in an application.
+// There is a similar file in linphone/include of source tree, that is required to build the linphonesw shared library.
+// They slightly differ - just adjusting the path the umbrella header to workaround some obsucure behaviors of Xcode
+// switft compiler. 
+// At some point you have to decide whether to live with this hack or spend two more weeks in understanding the 
+// internals of swift compiler.
+// At the time of writing this note, cmake 3.15 support of Swift is too minimalist.
+// -- SM in August 2019. REVISIT when cmake has decent swift support.
+
+module linphone {
+	umbrella header "Modules/swift-umbrella.h"
+
+	export *
+	module * { export * }
+}
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Modules/swift-umbrella.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Modules/swift-umbrella.h"
new file mode 100755
index 0000000..c1bf1ad
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/Modules/swift-umbrella.h"
@@ -0,0 +1,24 @@
+//
+//  include.h
+//  LinphoneSdk
+//
+//  Created by Danmei Chen on 15/05/2019.
+//  Copyright 漏 2019 belledonne. All rights reserved.
+//
+
+#ifndef include_h
+#define include_h
+#import "linphone/factory.h"
+#import "linphone/types.h"
+
+#import "linphone/core.h"
+#import "linphone/call.h"
+#import "linphone/tunnel.h"
+#import "linphone/wrapper_utils.h"
+#import "linphone/core_utils.h"
+
+#import "belle-sip/object.h"
+#import "bctoolbox/list.h"
+#import "mediastreamer2/msfactory.h"
+
+#endif /* include_h */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/cpim_grammar" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/cpim_grammar"
new file mode 100755
index 0000000..c89e4f8
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/cpim_grammar"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/identity_grammar" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/identity_grammar"
new file mode 100755
index 0000000..1cb16fb
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/identity_grammar"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/linphone" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/linphone"
new file mode 100755
index 0000000..d7c3e33
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/linphone"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/ringback.wav" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/ringback.wav"
new file mode 100755
index 0000000..21f4b5b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/ringback.wav"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/rootca.pem" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/rootca.pem"
new file mode 100755
index 0000000..4f7e9dc
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/linphone.framework/rootca.pem"
@@ -0,0 +1,3432 @@
+##
+## Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Thu Oct 17 07:52:38 2019
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt).  This file can be found in the mozilla source tree:
+## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+## Conversion done with mk-ca-bundle.pl version 1.25.
+## SHA1: 4575e6556ebb44c3fb53b56257abe27159707068
+##
+
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
+KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
+T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
+J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
+nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) F艖tan煤s铆tv谩ny
+============================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
+BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
+AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
+MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
+IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
+wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
+by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
+zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
+YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
+oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
+EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
+hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
+EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
+jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
+iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
+WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
+JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
+K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
+4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
+2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
+lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
+OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
+vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+Trustis FPS Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
+IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
+BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
+RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
+H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
+cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
+o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
+AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
+BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
+GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
+yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
+8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
+l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
+iB6XzCGcKQENZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+EE Certification Centre Root CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
+dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
+MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
+UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
+ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
+TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
+rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
+93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
+P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
+MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
+BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
+xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
+lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
+3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
+dcGWxZ0=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
+
+TeliaSonera Root CA v1
+======================
+-----BEGIN CERTIFICATE-----
+MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE
+CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4
+MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW
+VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+
+6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA
+3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k
+B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn
+Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH
+oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3
+F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ
+oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7
+gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc
+TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB
+AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW
+DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm
+zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx
+0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW
+pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV
+G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc
+c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT
+JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2
+qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6
+Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems
+WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY=
+-----END CERTIFICATE-----
+
+E-Tugra Certification Authority
+===============================
+-----BEGIN CERTIFICATE-----
+MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w
+DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls
+ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN
+ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw
+NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx
+QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl
+cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD
+DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd
+hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K
+CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g
+ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ
+BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0
+E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz
+rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq
+jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn
+rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5
+dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB
+/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG
+MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK
+kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO
+XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807
+VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo
+a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc
+dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV
+KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT
+Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0
+8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G
+C7TbO6Orb1wdtn7os4I07QZcJA==
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 2
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx
+MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ
+SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F
+vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970
+2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV
+WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy
+YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4
+r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf
+vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR
+3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN
+9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg==
+-----END CERTIFICATE-----
+
+Atos TrustedRoot 2011
+=====================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU
+cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4
+MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG
+A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV
+hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr
+54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+
+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320
+HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR
+z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R
+l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ
+bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h
+k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh
+TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9
+61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G
+3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 1 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE
+PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm
+PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6
+Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN
+ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l
+g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV
+7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX
+9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f
+iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg
+t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI
+hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC
+MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3
+GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct
+Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP
++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh
+3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa
+wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6
+O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0
+FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV
+hMJKzRwuJIczYOXD
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh
+ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY
+NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t
+oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o
+MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l
+V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo
+L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ
+sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD
+6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh
+lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI
+hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66
+AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K
+pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9
+x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz
+dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X
+U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw
+mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD
+zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN
+JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr
+O3jtZsSOeWmD3n+M
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3 G3
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG
+A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv
+b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN
+MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg
+RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286
+IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL
+Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe
+6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3
+I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U
+VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7
+5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi
+Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM
+dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt
+rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI
+hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px
+KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS
+t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ
+TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du
+DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib
+Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD
+hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX
+0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW
+dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2
+PpxxVJkES/1Y+Zj0
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw
+MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH
+35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq
+bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw
+VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP
+YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn
+lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO
+w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv
+0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz
+d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW
+hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M
+jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo
+IhNzbM8m9Yop5w==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD
+VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ
+BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb
+RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs
+KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF
+UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy
+YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy
+1vUhZscv6pZjamVFkpUBtA==
+-----END CERTIFICATE-----
+
+DigiCert Global Root G2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx
+MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ
+kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO
+3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV
+BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM
+UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB
+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu
+5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr
+F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U
+WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH
+QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/
+iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl
+MrY=
+-----END CERTIFICATE-----
+
+DigiCert Global Root G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV
+UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD
+VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw
+MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k
+aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C
+AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O
+YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP
+BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp
+Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y
+3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34
+VOKa5Vt8sycX
+-----END CERTIFICATE-----
+
+DigiCert Trusted Root G4
+========================
+-----BEGIN CERTIFICATE-----
+MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw
+HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1
+MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp
+pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o
+k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa
+vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY
+QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6
+MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm
+mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
+f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH
+dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8
+oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD
+ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY
+ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr
+yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy
+7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah
+ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN
+5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb
+/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa
+5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK
+G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
+82Z+
+-----END CERTIFICATE-----
+
+COMODO RSA Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn
+dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ
+FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+
+5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG
+x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX
+2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL
+OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3
+sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C
+GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5
+WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E
+FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt
+rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+
+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg
+tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW
+sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp
+pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA
+zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq
+ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52
+7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I
+LaZRfyHBNVOFBkpdn627G190
+-----END CERTIFICATE-----
+
+USERTrust RSA Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE
+BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK
+ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz
+0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j
+Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn
+RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O
++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq
+/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE
+Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM
+lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8
+yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+
+eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
+BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW
+FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ
+7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ
+Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM
+8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi
+FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi
+yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c
+J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw
+sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx
+Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9
+-----END CERTIFICATE-----
+
+USERTrust ECC Certification Authority
+=====================================
+-----BEGIN CERTIFICATE-----
+MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC
+VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
+aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2
+0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez
+nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV
+HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB
+HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu
+9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R4
+===========================
+-----BEGIN CERTIFICATE-----
+MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl
+OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P
+AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV
+MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF
+JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q=
+-----END CERTIFICATE-----
+
+GlobalSign ECC Root CA - R5
+===========================
+-----BEGIN CERTIFICATE-----
+MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb
+R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD
+EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6
+SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS
+h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx
+uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
+yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G3
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
+olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
+x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
+EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
+Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
+mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
+1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
+07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
+FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
+41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
+AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
+yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
+U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
+KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
+v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
+8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
+8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
+mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
+1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
+JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
+tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden EV Root CA
+================================
+-----BEGIN CERTIFICATE-----
+MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M
+MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl
+cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk
+SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW
+O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r
+0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8
+Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV
+XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr
+08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV
+0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd
+74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx
+fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa
+ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI
+eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu
+c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq
+5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN
+b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN
+f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi
+5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4
+WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK
+DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy
+eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg==
+-----END CERTIFICATE-----
+
+IdenTrust Commercial Root CA 1
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS
+b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES
+MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB
+IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld
+hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/
+mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi
+1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C
+XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl
+3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy
+NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV
+WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg
+xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix
+uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI
+hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH
+6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg
+ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt
+ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV
+YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX
+feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro
+kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe
+2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz
+Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R
+cGzM7vRX+Bi6hG6H
+-----END CERTIFICATE-----
+
+IdenTrust Public Sector Root CA 1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG
+EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv
+ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV
+UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS
+b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy
+P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6
+Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI
+rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf
+qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS
+mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn
+ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh
+LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v
+iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL
+4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B
+Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw
+DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj
+t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A
+mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt
+GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt
+m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx
+NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4
+Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI
+ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC
+ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ
+3Wl9af0AVqW3rLatt8o+Ae+c
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy
+bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug
+b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw
+HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT
+DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx
+OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP
+/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz
+HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU
+s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y
+TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx
+AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6
+0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z
+iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
+Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi
+nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+
+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO
+e4pIb4tF9g==
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority - EC1
+==========================================
+-----BEGIN CERTIFICATE-----
+MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx
+FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn
+YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw
+FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs
+LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg
+dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy
+AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef
+9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h
+vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8
+kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
+-----END CERTIFICATE-----
+
+CFCA EV ROOT
+============
+-----BEGIN CERTIFICATE-----
+MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE
+CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB
+IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw
+MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD
+DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV
+BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD
+7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN
+uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW
+ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7
+xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f
+py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K
+gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol
+hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ
+tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf
+BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB
+ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q
+ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua
+4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG
+E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX
+BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn
+aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy
+PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
+kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
+ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GB CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
+EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
+MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
+b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
+scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
+rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
+9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
+Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
+GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
+hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
+dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
+VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
+HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
+Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
+-----END CERTIFICATE-----
+
+SZAFIR ROOT CA2
+===============
+-----BEGIN CERTIFICATE-----
+MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
+A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
+BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
+BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
+VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
+qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
+DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
+2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
+ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
+ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
+AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
+AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
+O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
+oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
+4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA 2
+===========================
+-----BEGIN CERTIFICATE-----
+MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
+BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
+bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
+ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
+TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
+IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
+7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
+CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
+Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
+uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
+GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
+9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
+Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
+hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
+BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
+hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
+Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
+L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
+clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
+pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
+w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
+J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
+ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
+is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
+zAYspsbiDrW5viSP
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2015
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
+BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
+aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
+YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
+MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
+QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
+BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
+MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
+bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
+iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
+6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
+FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
+i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
+GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
+fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
+iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
+Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
+hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
+D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
+d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
+d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
+82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
+davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
+Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
+J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
+JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
+p/UsQu0yrbYhnr68
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions ECC RootCA 2015
+===========================================================
+-----BEGIN CERTIFICATE-----
+MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
+aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
+aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
+MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
+IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
+VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
+Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
+dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
+Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
+GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
+dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
+-----END CERTIFICATE-----
+
+ISRG Root X1
+============
+-----BEGIN CERTIFICATE-----
+MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE
+BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD
+EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG
+EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT
+DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r
+Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1
+3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K
+b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN
+Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ
+4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf
+1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu
+hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH
+usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r
+OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G
+A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY
+9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
+ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV
+0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt
+hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw
+TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx
+e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA
+JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD
+YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n
+JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ
+m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
+-----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM
+================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT
+AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw
+MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD
+TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf
+qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr
+btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL
+j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou
+08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw
+WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT
+tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ
+47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC
+ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa
+i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o
+dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD
+nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s
+D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ
+j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT
+Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW
++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7
+Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d
+8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm
+5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG
+rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM=
+-----END CERTIFICATE-----
+
+Amazon Root CA 1
+================
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1
+MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH
+FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ
+gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t
+dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce
+VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3
+DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM
+CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy
+8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa
+2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2
+xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5
+-----END CERTIFICATE-----
+
+Amazon Root CA 2
+================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD
+VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1
+MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv
+bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4
+kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp
+N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9
+AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd
+fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx
+kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS
+btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0
+Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN
+c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+
+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw
+DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA
+A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY
++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE
+YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW
+xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ
+gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW
+aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV
+Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3
+KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi
+JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw=
+-----END CERTIFICATE-----
+
+Amazon Root CA 3
+================
+-----BEGIN CERTIFICATE-----
+MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB
+f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr
+Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43
+rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc
+eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw==
+-----END CERTIFICATE-----
+
+Amazon Root CA 4
+================
+-----BEGIN CERTIFICATE-----
+MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG
+EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy
+NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ
+MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN
+/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri
+83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA
+MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1
+AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA==
+-----END CERTIFICATE-----
+
+LuxTrust Global Root 2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQELBQAwRjELMAkG
+A1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNVBAMMFkx1eFRydXN0IEdsb2Jh
+bCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUwMzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEW
+MBQGA1UECgwNTHV4VHJ1c3QgUy5BLjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wm
+Kb3FibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTemhfY7RBi2
+xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1EMShduxq3sVs35a0VkBC
+wGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsnXpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm
+1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkm
+FRseTJIpgp7VkoGSQXAZ96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niF
+wpN6cj5mj5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4gDEa/
+a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+8kPREd8vZS9kzl8U
+ubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2jX5t/Lax5Gw5CMZdjpPuKadUiDTSQ
+MC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmHhFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB
+/zBCBgNVHSAEOzA5MDcGByuBKwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5
+Lmx1eHRydXN0Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT
++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQELBQADggIBAGoZ
+FO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9BzZAcg4atmpZ1gDlaCDdLnIN
+H2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTOjFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW
+7MM3LGVYvlcAGvI1+ut7MV3CwRI9loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIu
+ZY+kt9J/Z93I055cqqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWA
+VWe+2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/JEAdemrR
+TxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKrezrnK+T+Tb/mjuuqlPpmt
+/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQfLSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc
+7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31I
+iyBMz2TWuJdGsE7RKlY6oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr
+-----END CERTIFICATE-----
+
+TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT
+D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr
+IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g
+TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp
+ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD
+VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt
+c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth
+bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11
+IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8
+6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc
+wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0
+3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9
+WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU
+ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
+KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh
+AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc
+lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
+e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
+q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
+-----END CERTIFICATE-----
+
+GDCA TrustAUTH R5 ROOT
+======================
+-----BEGIN CERTIFICATE-----
+MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw
+BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD
+DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow
+YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ
+IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs
+AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p
+OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr
+pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ
+9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ
+xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM
+R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ
+D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4
+oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx
+9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg
+p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9
+H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35
+6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd
++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ
+HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD
+F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ
+8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv
+/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT
+aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g==
+-----END CERTIFICATE-----
+
+TrustCor RootCert CA-1
+======================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
+MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
+U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
+MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
+YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
+VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
+dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
+jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
+pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
+JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
+gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
+/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
+BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
+mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
+ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
+qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
+3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
+-----END CERTIFICATE-----
+
+TrustCor RootCert CA-2
+======================
+-----BEGIN CERTIFICATE-----
+MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
+DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
+eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
+eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
+MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
+bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
+cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
+IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
+ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
+RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
+oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
+XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
+/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
+jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
+eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
+rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
+8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
+2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
+Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
+kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
+2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
+S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
+PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
+DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
+RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
+xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
+RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
+-----END CERTIFICATE-----
+
+TrustCor ECA-1
+==============
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
+MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
+U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
+N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
+MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
+IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
+MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
+xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
+p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
+YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
+f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
+AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
+/ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
+hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
+J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
+jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
+-----END CERTIFICATE-----
+
+SSL.com Root Certification Authority RSA
+========================================
+-----BEGIN CERTIFICATE-----
+MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM
+BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x
+MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw
+MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
+EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM
+LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C
+Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8
+P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge
+oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp
+k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z
+fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ
+gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2
+UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8
+1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s
+bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV
+HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr
+dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf
+ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl
+u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq
+erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj
+MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ
+vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI
+Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y
+wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI
+WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
+-----END CERTIFICATE-----
+
+SSL.com Root Certification Authority ECC
+========================================
+-----BEGIN CERTIFICATE-----
+MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
+BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
+BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
+MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
+BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
+bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
+hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
+jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
+e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
+5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
+-----END CERTIFICATE-----
+
+SSL.com EV Root Certification Authority RSA R2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
+DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
+MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
+MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
+DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
+VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
+hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
+cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
+Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
+B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
+CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
+9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
+RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
+JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
+HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
+qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
+++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
+Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
+guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
+OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
+CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
+lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
+rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
+hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
+9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
+-----END CERTIFICATE-----
+
+SSL.com EV Root Certification Authority ECC
+===========================================
+-----BEGIN CERTIFICATE-----
+MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
+BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
+BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
+MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
+EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
+LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
+BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
+3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
+BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
+5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
+N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
+m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R6
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX
+R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds
+b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i
+YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs
+U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss
+grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE
+3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF
+vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM
+PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+
+azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O
+WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy
+CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP
+0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN
+b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE
+AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV
+HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN
+nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0
+lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY
+BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym
+Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr
+3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1
+0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T
+uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK
+oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t
+JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA=
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GC CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD
+SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo
+MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa
+Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL
+ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh
+bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr
+VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab
+NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd
+BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E
+AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk
+AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9
+-----END CERTIFICATE-----
+
+GTS Root R1
+===========
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
+EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
+b3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
+A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx
+9vaMf/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7r
+aKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnW
+r4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqM
+LnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly
+4cpk9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr
+06zqkUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92
+wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om
+3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNu
+JLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEM
+BQADggIBADiWCu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1
+d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6ZXPYfcX3v73sv
+fuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZRgyFmxhE+885H7pwoHyXa/6xm
+ld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9b
+gsiG1eGZbYwE8na6SfZu6W0eX6DvJ4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq
+4BjFbkerQUIpm/ZgDdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWEr
+tXvM+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyyF62ARPBo
+pY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9SQ98POyDGCBDTtWTurQ0
+sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdwsE3PYJ/HQcu51OyLemGhmW/HGY0dVHLql
+CFF1pkgl
+-----END CERTIFICATE-----
+
+GTS Root R2
+===========
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQG
+EwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJv
+b3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAG
+A1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTuk
+k3LvCvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo
+7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWI
+m8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5Gm
+dFrS+LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbu
+ak7MkogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscsz
+cTJGr61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RW
+Ir9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73Vululycsl
+aVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy
+5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEM
+BQADggIBALZp8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT
+vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiTz9D2PGcDFWEJ
++YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiApJiS4wGWAqoC7o87xdFtCjMw
+c3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvbpxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3Da
+WsYDQvTtN6LwG1BUSw7YhN4ZKJmBR64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5r
+n/WkhLx3+WuXrD5RRaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56Gtmwfu
+Nmsk0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC5AwiWVIQ
+7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiFizoHCBy69Y9Vmhh1fuXs
+gWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLnyOd/xCxgXS/Dr55FBcOEArf9LAhST4Ld
+o/DUhgkC
+-----END CERTIFICATE-----
+
+GTS Root R3
+===========
+-----BEGIN CERTIFICATE-----
+MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUU
+Rout736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24Cej
+QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP
+0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFukfCPAlaUs3L6JbyO5o91lAFJekazInXJ0
+glMLfalAvWhgxeG4VDvBNhcl2MG9AjEAnjWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOa
+KaqW04MjyaR7YbPMAuhd
+-----END CERTIFICATE-----
+
+GTS Root R4
+===========
+-----BEGIN CERTIFICATE-----
+MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJV
+UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg
+UjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE
+ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa
+6zzuhXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqj
+QjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV
+2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0CMRw3J5QdCHojXohw0+WbhXRIjVhLfoI
+N+4Zba3bssx9BzT1YBkstTTZbyACMANxsbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11x
+zPKwTdb+mciUqXWi4w==
+-----END CERTIFICATE-----
+
+UCA Global G2 Root
+==================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG
+EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x
+NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU
+cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT
+oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV
+8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS
+h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o
+LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/
+R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe
+KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa
+4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc
+OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97
+8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
+BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo
+5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5
+1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A
+Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9
+yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX
+c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo
+jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk
+bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x
+ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn
+RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A==
+-----END CERTIFICATE-----
+
+UCA Extended Validation Root
+============================
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG
+EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u
+IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G
+A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs
+iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF
+Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu
+eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR
+59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH
+0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR
+el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv
+B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth
+WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS
+NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS
+3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL
+BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR
+ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM
+aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4
+dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb
++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW
+F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi
+GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc
+GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi
+djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr
+dhh2n1ax
+-----END CERTIFICATE-----
+
+Certigna Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE
+BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ
+MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda
+MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz
+MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX
+stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz
+KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8
+JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16
+XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq
+4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej
+wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ
+lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI
+jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/
+/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of
+1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy
+dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h
+LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl
+cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt
+OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP
+TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq
+7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3
+4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd
+8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS
+6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY
+tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS
+aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde
+E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0=
+-----END CERTIFICATE-----
+
+emSign Root CA - G1
+===================
+-----BEGIN CERTIFICATE-----
+MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET
+MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl
+ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx
+ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk
+aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN
+LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1
+cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW
+DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ
+6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH
+hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2
+vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q
+NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q
++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih
+U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx
+iN66zB+Afko=
+-----END CERTIFICATE-----
+
+emSign ECC Root CA - G3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG
+A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg
+MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4
+MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11
+ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g
+RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc
+58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr
+MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D
+CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7
+jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj
+-----END CERTIFICATE-----
+
+emSign Root CA - C1
+===================
+-----BEGIN CERTIFICATE-----
+MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx
+EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp
+Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE
+BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD
+ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up
+ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/
+Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX
+OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V
+I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms
+lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+
+XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD
+ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp
+/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1
+NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9
+wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ
+BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI=
+-----END CERTIFICATE-----
+
+emSign ECC Root CA - C3
+=======================
+-----BEGIN CERTIFICATE-----
+MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG
+A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF
+Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE
+BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD
+ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd
+6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9
+SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA
+B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA
+MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU
+ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG
+A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK
+Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2
+MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv
+bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX
+SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz
+iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf
+jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim
+5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe
+sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj
+0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/
+JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u
+y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h
++bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG
+xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID
+AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e
+i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN
+AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw
+W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld
+y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov
++BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc
+eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw
+9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7
+nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY
+hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB
+60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq
+dBb9HxEGmpv0
+-----END CERTIFICATE-----
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/allfilters.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/allfilters.h"
new file mode 100755
index 0000000..2dab562
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/allfilters.h"
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef allfilters_h
+#define allfilters_h
+
+/* this is the enum where to add your own filter id.
+Please take care of always add new IDs at the end in order to preserve the binary interface*/
+/*this id is used for type checking of methods, events with filters */
+/*it must be used also to create filters */
+typedef enum MSFilterId{
+	MS_FILTER_NOT_SET_ID,
+	MS_FILTER_PLUGIN_ID,	/* no type checking will be performed on plugins */
+	MS_FILTER_BASE_ID,
+	MS_ALSA_READ_ID,
+	MS_ALSA_WRITE_ID,
+	MS_OSS_READ_ID,
+	MS_OSS_WRITE_ID,
+	MS_ULAW_ENC_ID,
+	MS_ULAW_DEC_ID,
+	MS_ALAW_ENC_ID,
+	MS_ALAW_DEC_ID,
+	MS_RTP_SEND_ID,
+	MS_RTP_RECV_ID,
+	MS_FILE_PLAYER_ID,
+	MS_FILE_REC_ID,
+	MS_DTMF_GEN_ID,
+	MS_SPEEX_ENC_ID,
+	MS_SPEEX_DEC_ID,
+	MS_GSM_ENC_ID,
+	MS_GSM_DEC_ID,
+	MS_V4L_ID,
+	MS_SDL_OUT_ID,
+	MS_H263_ENC_ID,
+	MS_H263_DEC_ID,
+	MS_ARTS_READ_ID,
+	MS_ARTS_WRITE_ID,
+	MS_WINSND_READ_ID,
+	MS_WINSND_WRITE_ID,
+	MS_SPEEX_EC_ID,
+	MS_PIX_CONV_ID,
+	MS_TEE_ID,
+	MS_SIZE_CONV_ID,
+	MS_CONF_ID,
+	MS_THEORA_ENC_ID,
+	MS_THEORA_DEC_ID,
+	MS_PASND_READ_ID,
+	MS_PASND_WRITE_ID,
+	MS_MPEG4_ENC_ID,
+	MS_MPEG4_DEC_ID,
+	MS_MJPEG_DEC_ID,
+	MS_JOIN_ID,
+	MS_RESAMPLE_ID,
+	MS_VIDEO_OUT_ID,
+	MS_VOLUME_ID,
+	MS_SNOW_DEC_ID,
+	MS_SNOW_ENC_ID,
+	MS_CA_READ_ID,
+	MS_CA_WRITE_ID,
+	MS_WINSNDDS_READ_ID,
+	MS_WINSNDDS_WRITE_ID,
+	MS_STATIC_IMAGE_ID,
+	MS_V4L2_CAPTURE_ID,
+	MS_H263_OLD_DEC_ID,
+	MS_H263_OLD_ENC_ID,
+	MS_MIRE_ID,
+	MS_VFW_ID,
+	MS_VOID_SOURCE_ID,
+	MS_VOID_SINK_ID,
+	MS_DSCAP_ID,
+	MS_AQ_READ_ID,
+	MS_AQ_WRITE_ID,
+	MS_EQUALIZER_ID,
+	MS_JPEG_DEC_ID,
+	MS_JPEG_ENC_ID,
+	MS_PULSE_READ_ID,
+	MS_PULSE_WRITE_ID,
+	MS_DRAWDIB_DISPLAY_ID,
+	MS_CHANNEL_ADAPTER_ID,
+	MS_AUDIO_MIXER_ID,
+	MS_ITC_SINK_ID,
+	MS_ITC_SOURCE_ID,
+	MS_EXT_DISPLAY_ID,
+	MS_H264_DEC_ID,
+	MS_IOUNIT_READ_ID,
+	MS_IOUNIT_WRITE_ID,
+	MS_ANDROID_SOUND_READ_ID,
+	MS_ANDROID_SOUND_WRITE_ID,
+	MS_JPEG_WRITER_ID,
+	MS_QRCODE_READER_ID,
+	MS_X11VIDEO_ID,
+	MS_ANDROID_DISPLAY_ID,
+	MS_ANDROID_VIDEO_READ_ID,
+	MS_ANDROID_VIDEO_WRITE_ID,
+	MS_TONE_DETECTOR_ID,
+	MY_FILTER_ID,
+	MS_IOS_DISPLAY_ID,
+	MS_VP8_ENC_ID,
+	MS_VP8_DEC_ID,
+	MS_G722_ENC_ID,
+	MS_G722_DEC_ID,
+	MS_G726_40_ENC_ID,
+	MS_G726_32_ENC_ID,
+	MS_G726_24_ENC_ID,
+	MS_G726_16_ENC_ID,
+	MS_AAL2_G726_40_ENC_ID,
+	MS_AAL2_G726_32_ENC_ID,
+	MS_AAL2_G726_24_ENC_ID,
+	MS_AAL2_G726_16_ENC_ID,
+	MS_G726_40_DEC_ID,
+	MS_G726_32_DEC_ID,
+	MS_G726_24_DEC_ID,
+	MS_G726_16_DEC_ID,
+	MS_AAL2_G726_40_DEC_ID,
+	MS_AAL2_G726_32_DEC_ID,
+	MS_AAL2_G726_24_DEC_ID,
+	MS_AAL2_G726_16_DEC_ID,
+	MS_L16_ENC_ID,
+	MS_L16_DEC_ID,
+	MS_OSX_GL_DISPLAY_ID,
+	MS_GLXVIDEO_ID,
+	MS_GENERIC_PLC_ID,
+	MS_WEBRTC_AEC_ID,
+	MS_AAC_ELD_ENC_ID,
+	MS_AAC_ELD_DEC_ID,
+	MS_OPUS_ENC_ID,
+	MS_OPUS_DEC_ID,
+	MS_QSA_READ_ID,
+	MS_QSA_WRITE_ID,
+	MS_MKV_RECORDER_ID,
+	MS_MKV_PLAYER_ID,
+	MS_VAD_DTX_ID,
+	MS_BB10_DISPLAY_ID,
+	MS_BB10_CAPTURE_ID,
+	MS_VT_H263_ENC_ID,
+	MS_VT_H263_DEC_ID,
+	MS_VT_H264_ENC_ID,
+	MS_VT_H264_DEC_ID,
+	MS_RTT_4103_SOURCE_ID,
+	MS_RTT_4103_SINK_ID,
+	MS_MEDIACODEC_H264_DEC_ID,
+	MS_MEDIACODEC_H264_ENC_ID,
+	MS_BV16_DEC_ID,
+	MS_BV16_ENC_ID,
+	MS_UDP_SEND_ID,
+	MS_PCAP_FILE_PLAYER_ID,
+	MS_OGL_ID,
+	MS_G729_DEC_ID,
+	MS_G729_ENC_ID,
+	MS_WASAPI_READ_ID,
+	MS_WASAPI_WRITE_ID,
+	MS_AUDIO_FLOW_CONTROL_ID,
+	MS_MEDIACODEC_H265_DEC_ID,
+	MS_MEDIACODEC_H265_ENC_ID,
+	MS_VT_H265_DEC_ID,
+	MS_VT_H265_ENC_ID,
+	MS_ANDROID_DISPLAY_BAD_ID,
+	MS_ANDROID_OPENGL_DISPLAY_ID,
+	MS_ANDROID_TEXTURE_DISPLAY_ID
+} MSFilterId;
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/android_utils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/android_utils.h"
new file mode 100755
index 0000000..b6d5e38
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/android_utils.h"
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef android_utils_h
+#define android_utils_h
+
+#include <mediastreamer2/msfilter.h>
+#include <jni.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Creates an AcousticEchoCanceler java object for the given session ID so the sound card uses the device's hardware echo canceller if available.
+ * Currently only AndroidSound, AndroidSoundDepr and AAudio sound cards support it.
+**/
+MS2_PUBLIC jobject ms_android_enable_hardware_echo_canceller(JNIEnv *env, int sessionId);
+
+/**
+ * Deletes the AcousticEchoCanceler created by ms_android_enable_hardware_echo_canceller.
+**/
+MS2_PUBLIC void ms_android_delete_hardware_echo_canceller(JNIEnv *env, jobject aec);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // android_utils_h
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/bitratecontrol.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/bitratecontrol.h"
new file mode 100755
index 0000000..4b5b28a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/bitratecontrol.h"
@@ -0,0 +1,253 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ms2_ratecontrol
+#define ms2_ratecontrol
+
+#include "mediastreamer2/msfilter.h"
+#include <ortp/ortp.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _MediaStream;
+
+typedef struct _MSBandwidthControllerStats{
+	float estimated_download_bandwidth; /*in bits/seconds*/
+	float controlled_stream_bandwidth;
+	bool_t in_congestion;
+}MSBandwidthControllerStats;
+
+struct _MSBandwidthController{
+	bctbx_list_t *streams; /*list of MediaStream objects*/
+	struct _MediaStream *controlled_stream; /*the most bandwidth consuming stream, which is the one flow controlled*/
+	MSBandwidthControllerStats stats;
+	float remote_video_bandwidth_available_estimated;
+	bool_t congestion_detected;
+};
+/**
+ * The MSBandwidthController is a object managing several streams (audio, video) and monitoring congestion of inbound streams.
+ * If a congestion is detected, it will send RTCP TMMBR packet to the remote sender in order to stop the congestion and adapt
+ * the incoming bitrate of received streams to the available bandwidth.
+ * It superseeds the MSBitrateController, MSQosAnalyzer, MSBitrateDriver objects, which were using different but less robust techniques
+ * to detect congestion and adapt bandwidth usage.
+**/
+typedef struct _MSBandwidthController MSBandwidthController;
+
+
+MS2_PUBLIC MSBandwidthController *ms_bandwidth_controller_new(void);
+
+MS2_PUBLIC void ms_bandwidth_controller_add_stream(MSBandwidthController *obj, struct _MediaStream *stream);
+
+MS2_PUBLIC void ms_bandwidth_controller_remove_stream(MSBandwidthController *obj, struct _MediaStream *stream);
+
+MS2_PUBLIC const MSBandwidthControllerStats * ms_bandwidth_controller_get_stats(MSBandwidthController *obj);
+
+MS2_PUBLIC void ms_bandwidth_controller_reset_state(MSBandwidthController *obj);
+
+MS2_PUBLIC void ms_bandwidth_controller_destroy(MSBandwidthController *obj);
+	
+
+/**
+ * Audio Bitrate controller object.
+ * @deprecated
+**/
+typedef struct _MSAudioBitrateController MSAudioBitrateController;
+
+enum _MSRateControlActionType{
+	MSRateControlActionDoNothing,
+	MSRateControlActionDecreaseBitrate,
+	MSRateControlActionDecreasePacketRate,
+	MSRateControlActionIncreaseQuality,
+};
+typedef enum _MSRateControlActionType MSRateControlActionType;
+const char *ms_rate_control_action_type_name(MSRateControlActionType t);
+
+
+typedef struct _MSRateControlAction{
+	MSRateControlActionType type;
+	int value;
+}MSRateControlAction;
+
+typedef struct _MSBitrateDriver MSBitrateDriver;
+typedef struct _MSBitrateDriverDesc MSBitrateDriverDesc;
+
+struct _MSBitrateDriverDesc{
+	int (*execute_action)(MSBitrateDriver *obj, const MSRateControlAction *action);
+	void (*uninit)(MSBitrateDriver *obj);
+};
+
+/**
+ * The MSBitrateDriver has the responsibility to execute rate control actions.
+ * This is an abstract interface.
+ * @deprecated
+**/
+struct _MSBitrateDriver{
+	MSBitrateDriverDesc *desc;
+	int refcnt;
+};
+
+MS2_PUBLIC int ms_bitrate_driver_execute_action(MSBitrateDriver *obj, const MSRateControlAction *action);
+MS2_PUBLIC MSBitrateDriver * ms_bitrate_driver_ref(MSBitrateDriver *obj);
+MS2_PUBLIC void ms_bitrate_driver_unref(MSBitrateDriver *obj);
+
+MS2_PUBLIC MSBitrateDriver *ms_audio_bitrate_driver_new(RtpSession *session, MSFilter *encoder);
+MS2_PUBLIC MSBitrateDriver *ms_av_bitrate_driver_new(RtpSession *asession, MSFilter *aenc, RtpSession *vsession, MSFilter *venc);
+MS2_PUBLIC MSBitrateDriver *ms_bandwidth_bitrate_driver_new(RtpSession *asession, MSFilter *aenc, RtpSession *vsession, MSFilter *venc);
+
+typedef struct _MSQosAnalyzer MSQosAnalyzer;
+typedef struct _MSQosAnalyzerDesc MSQosAnalyzerDesc;
+
+struct _MSQosAnalyzerDesc{
+	bool_t (*process_rtcp)(MSQosAnalyzer *obj, mblk_t *rtcp);
+	void (*suggest_action)(MSQosAnalyzer *obj, MSRateControlAction *action);
+	bool_t (*has_improved)(MSQosAnalyzer *obj);
+	void (*update)(MSQosAnalyzer *);
+	void (*uninit)(MSQosAnalyzer *);
+};
+
+enum _MSQosAnalyzerAlgorithm {
+	MSQosAnalyzerAlgorithmSimple,
+	MSQosAnalyzerAlgorithmStateful
+};
+typedef enum _MSQosAnalyzerAlgorithm MSQosAnalyzerAlgorithm;
+MS2_PUBLIC const char* ms_qos_analyzer_algorithm_to_string(MSQosAnalyzerAlgorithm alg);
+MS2_PUBLIC MSQosAnalyzerAlgorithm ms_qos_analyzer_algorithm_from_string(const char* alg);
+
+/**
+ * A MSQosAnalyzer is responsible to analyze RTCP feedback and suggest
+ * actions on bitrate or packet rate accordingly.
+ * This is an abstract interface.
+ * @deprecated
+**/
+struct _MSQosAnalyzer{
+	MSQosAnalyzerDesc *desc;
+	OrtpLossRateEstimator *lre;
+	char *label;
+	/**
+	* Each time the algorithm suggest an action, this callback is called with the userpointer
+	* @param userpointer on_action_suggested_user_pointer pointer given
+	* @param argc number of arguments on the third argument array
+	* @param argv array containing various algorithm dependent information
+	**/
+	void (*on_action_suggested)(void* userpointer, int argc, const char** argv);
+	/** User pointer given at #on_action_suggested callback **/
+	void *on_action_suggested_user_pointer;
+	int refcnt;
+	MSQosAnalyzerAlgorithm type;
+};
+
+
+MS2_PUBLIC MSQosAnalyzer * ms_qos_analyzer_ref(MSQosAnalyzer *obj);
+MS2_PUBLIC void ms_qos_analyzer_unref(MSQosAnalyzer *obj);
+MS2_PUBLIC void ms_qos_analyser_set_label(MSQosAnalyzer *obj, const char *label);
+MS2_PUBLIC void ms_qos_analyzer_suggest_action(MSQosAnalyzer *obj, MSRateControlAction *action);
+MS2_PUBLIC bool_t ms_qos_analyzer_has_improved(MSQosAnalyzer *obj);
+MS2_PUBLIC bool_t ms_qos_analyzer_process_rtcp(MSQosAnalyzer *obj, mblk_t *rtcp);
+MS2_PUBLIC void ms_qos_analyzer_update(MSQosAnalyzer *obj);
+MS2_PUBLIC const char* ms_qos_analyzer_get_name(MSQosAnalyzer *obj);
+MS2_PUBLIC void ms_qos_analyzer_set_on_action_suggested(MSQosAnalyzer *obj, void (*on_action_suggested)(void*,int,const char**),void* u);
+
+/**
+ * The simple qos analyzer is an implementation of MSQosAnalyzer that performs analysis for single stream.
+**/
+MS2_PUBLIC MSQosAnalyzer * ms_simple_qos_analyzer_new(RtpSession *session);
+
+MS2_PUBLIC MSQosAnalyzer * ms_stateful_qos_analyzer_new(RtpSession *session);
+/**
+ * The audio/video qos analyzer is an implementation of MSQosAnalyzer that performs analysis of two audio and video streams.
+**/
+/*MSQosAnalyzer * ms_av_qos_analyzer_new(RtpSession *asession, RtpSession *vsession);*/
+
+/**
+ * The MSBitrateController the overall behavior and state machine of the adaptive rate control system.
+ * It requires a MSQosAnalyzer to obtain analyse of the quality of service, and a MSBitrateDriver
+ * to run the actions on media streams, like decreasing or increasing bitrate.
+**/
+typedef struct _MSBitrateController MSBitrateController;
+
+/**
+ * Instanciates MSBitrateController
+ * @param qosanalyzer a Qos analyzer object
+ * @param driver a bitrate driver object.
+ * The newly created bitrate controller owns references to the analyzer and the driver.
+**/
+MS2_PUBLIC MSBitrateController *ms_bitrate_controller_new(MSQosAnalyzer *qosanalyzer, MSBitrateDriver *driver);
+
+/**
+ * Asks the bitrate controller to process a newly received RTCP packet.
+ * @param MSBitrateController the bitrate controller object.
+ * @param rtcp an RTCP packet received for the media session(s) being managed by the controller.
+ * If the RTCP packet contains useful feedback regarding quality of the media streams received by the far end,
+ * then the bitrate controller may take decision and execute actions on the local media streams to adapt the
+ * output bitrate.
+**/
+MS2_PUBLIC void ms_bitrate_controller_process_rtcp(MSBitrateController *obj, mblk_t *rtcp);
+
+MS2_PUBLIC void ms_bitrate_controller_update(MSBitrateController *obj);
+
+/**
+ * Return the QoS analyzer associated to the bitrate controller
+**/
+MS2_PUBLIC MSQosAnalyzer * ms_bitrate_controller_get_qos_analyzer(MSBitrateController *obj);
+
+/**
+ * Destroys the bitrate controller
+ *
+ * If no other entity holds references to the underlyings MSQosAnalyzer and MSBitrateDriver object,
+ * then they will be destroyed too.
+**/
+MS2_PUBLIC void ms_bitrate_controller_destroy(MSBitrateController *obj);
+
+/**
+ * Convenience function to create a bitrate controller managing a single audio stream.
+ * @param session the RtpSession object for the media stream
+ * @param encoder the MSFilter object responsible for encoding the audio data.
+ * @param flags unused.
+ * This function actually calls internally:
+ * <br>
+ * \code
+ * ms_bitrate_controller_new(ms_simple_qos_analyzer_new(session),ms_audio_bitrate_driver_new(encoder));
+ * \endcode
+**/
+MS2_PUBLIC MSBitrateController *ms_audio_bitrate_controller_new(RtpSession *session, MSFilter *encoder, unsigned int flags);
+
+/**
+ * Convenience fonction to create a bitrate controller managing a video and an audio stream.
+ * @param vsession the video RtpSession
+ * @param venc the video encoder
+ * @param asession the audio RtpSession
+ * @param aenc the audio encoder
+ * This function actually calls internally:
+ * <br>
+ * \code
+ * ms_bitrate_controller_new(ms_av_qos_analyzer_new(asession,vsession),ms_av_bitrate_driver_new(aenc,venc));
+ * \endcode
+**/
+MS2_PUBLIC MSBitrateController *ms_av_bitrate_controller_new(RtpSession *asession, MSFilter *aenc, RtpSession *vsession, MSFilter *venc);
+
+MS2_PUBLIC MSBitrateController *ms_bandwidth_bitrate_controller_new(RtpSession *asession, MSFilter *aenc, RtpSession *vsession, MSFilter *venc);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/bits_rw.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/bits_rw.h"
new file mode 100755
index 0000000..a2d9c1d
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/bits_rw.h"
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#if !defined(_BITS_RW_H_)
+#define _BITS_RW_H_
+
+#include <ortp/port.h>
+
+typedef struct ms_bits_reader{
+	const uint8_t *buffer;
+	size_t buf_size;
+	int bit_index;
+} MSBitsReader;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void ms_bits_reader_init(MSBitsReader *reader, const uint8_t *buffer, size_t bufsize);
+
+int ms_bits_reader_n_bits(MSBitsReader *reader, int count, unsigned int *ret, const char* symbol_name);
+
+int ms_bits_reader_ue(MSBitsReader *reader, unsigned int* ret, const char* symbol_name);
+
+int ms_bits_reader_se(MSBitsReader *reader, int* ret, const char* symbol_name);
+
+typedef struct ms_bits_writer {
+	uint8_t* buffer;
+	size_t buf_size;
+	int bit_index;
+} MSBitsWriter;
+
+void ms_bits_writer_init(MSBitsWriter *writer, size_t initialbufsize);
+
+int ms_bits_writer_n_bits(MSBitsWriter *writer, int count, unsigned int value, const char* symbol_name);
+
+int ms_bits_writer_ue(MSBitsWriter *writer, unsigned int value, const char* symbol_name);
+
+int ms_bits_writer_se(MSBitsWriter *writer, int value, const char* symbol_name);
+
+int ms_bits_writer_trailing_bits(MSBitsWriter *writer);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/box-plot.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/box-plot.h"
new file mode 100755
index 0000000..6263b5b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/box-plot.h"
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _MS2_BOX_PLOT_H
+#define _MS2_BOX_PLOT_H
+
+#include <stdint.h>
+
+typedef struct _MSBoxPlot {
+	int64_t min;
+	int64_t max;
+	double mean;
+	double quad_moment; // E(X^2)
+	uint64_t count;
+} MSBoxPlot;
+
+void ms_box_plot_reset(MSBoxPlot *bp);
+void ms_box_plot_add_value(MSBoxPlot *bp, int64_t value);
+
+double ms_box_plot_get_variance(const MSBoxPlot *bp);
+double ms_box_plot_get_standard_deviation(const MSBoxPlot *bp);
+
+char *ms_box_plot_to_string(const MSBoxPlot *bp, const char *unit);
+
+
+typedef struct _MSUBoxPlot {
+	uint64_t min;
+	uint64_t max;
+	double mean;
+	double quad_moment; // E(X^2)
+	uint64_t count;
+} MSUBoxPlot;
+
+void ms_u_box_plot_reset(MSUBoxPlot *bp);
+void ms_u_box_plot_add_value(MSUBoxPlot *bp, uint64_t value);
+
+double ms_u_box_plot_get_variance(const MSUBoxPlot *bp);
+double ms_u_box_plot_get_standard_deviation(const MSUBoxPlot *bp);
+
+char *ms_u_box_plot_to_string(const MSUBoxPlot *bp, const char *unit);
+
+
+#endif // _MS2_BOX_PLOT_H
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/devices.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/devices.h"
new file mode 100755
index 0000000..51fc39e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/devices.h"
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef ms_devices_h
+#define ms_devices_h
+
+#include <mediastreamer2/mscommon.h>
+
+#define DEVICE_HAS_BUILTIN_AEC               (1)
+#define DEVICE_HAS_BUILTIN_AEC_CRAPPY        (1<<1)  /* set when the device is claiming to have AEC but we should not trust it */
+#define DEVICE_USE_ANDROID_MIC               (1<<2)  /* set when the device needs to capture using MIC instead of Voice communication (I.E kindle fire) */
+#define DEVICE_HAS_BUILTIN_OPENSLES_AEC      (1<<3)  /* set when the device automatically enables it's AEC when using OpenSLES */
+#define DEVICE_HAS_CRAPPY_ANDROID_FASTTRACK  (1<<4)  /* set when the AUDIO_OUTPUT_FLAG_FAST flag of android AudioTrack doesn't work*/
+#define DEVICE_HAS_CRAPPY_ANDROID_FASTRECORD (1<<5)  /* set when the AUDIO_INPUT_FLAG_FAST flag of android AudioRecord doesn't work*/
+#define DEVICE_HAS_UNSTANDARD_LIBMEDIA       (1<<6)  /* set when the libmedia backend shall not be used because of proprietary modifications made into it by the manufacturer*/
+#define DEVICE_HAS_CRAPPY_OPENGL             (1<<7)  /* set when the opengl is crappy and our opengl surfaceview will crash */
+#define DEVICE_HAS_CRAPPY_OPENSLES           (1<<8)  /* set when the opensles latency is crappy*/
+#define DEVICE_USE_ANDROID_CAMCORDER         (1<<9)  /* set when the device needs to capture using CAMCORDER instead of Voice communication (I.E kindle fire) */
+#define DEVICE_MCH264ENC_NO_PIX_FMT_CONV     (1<<10) /* set in order to avoid pixel format convervion before MediaCodec H264 encoder input */
+#define DEVICE_MCH265_LIMIT_DEQUEUE_OF_OUTPUT_BUFFERS     (1<<11) /* set in order to avoid calling dequeueOutputBuffers() too often. */
+
+struct SoundDeviceAudioHacks {
+	const char *mic_equalizer;
+	float mic_gain;
+	const char *spk_equalizer;
+	float spk_gain;
+};
+
+typedef struct SoundDeviceAudioHacks SoundDeviceAudioHacks;
+
+struct SoundDeviceDescription{
+	const char *manufacturer;
+	const char *model;
+	const char *platform;
+	unsigned int flags;
+	int delay;
+	int recommended_rate;
+	SoundDeviceAudioHacks *hacks;
+};
+
+typedef struct SoundDeviceDescription SoundDeviceDescription;
+
+struct MSDevicesInfo {
+	MSList *sound_devices_descriptions;
+};
+
+typedef struct MSDevicesInfo MSDevicesInfo;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+MSDevicesInfo *ms_devices_info_new(void);
+
+void ms_devices_info_free(MSDevicesInfo *devices_info);
+
+int ms2_android_get_sdk_version(void);
+
+MS2_PUBLIC void ms_devices_info_add(MSDevicesInfo *devices_info, const char *manufacturer, const char *model, const char *platform, unsigned int flags, int delay, int recommended_rate);
+
+MS2_PUBLIC SoundDeviceDescription* ms_devices_info_lookup_device(MSDevicesInfo *devices_info, const char *manufacturer, const char* model, const char *platform);
+
+MS2_PUBLIC SoundDeviceDescription* ms_devices_info_get_sound_device_description(MSDevicesInfo *devices_info);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dsptools.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dsptools.h"
new file mode 100755
index 0000000..4a98aeb
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dsptools.h"
@@ -0,0 +1,389 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/* This file contains useful DSP routines from the speex project.
+*/
+
+/* Copyright (C) 2002-2006 Jean-Marc Valin 
+   
+   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 Xiph.org 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION 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.
+*/
+
+#ifndef ms_dsptools_h
+#define ms_dsptools_h
+
+#include <mediastreamer2/mscommon.h>
+
+typedef int32_t ms_int32_t;
+
+#ifdef MS_FIXED_POINT
+
+typedef short ms_word16_t;
+typedef int   ms_word32_t;
+typedef int ms_mem_t;
+typedef short ms_coef_t;
+
+#define QCONST16(x,bits) ((ms_word16_t)(.5+(x)*(((ms_word32_t)1)<<(bits))))
+#define QCONST32(x,bits) ((ms_word32_t)(.5+(x)*(((ms_word32_t)1)<<(bits))))
+
+#define NEG16(x) (-(x))
+#define NEG32(x) (-(x))
+#define EXTRACT16(x) ((ms_word16_t)(x))
+#define EXTEND32(x) ((ms_word32_t)(x))
+#define SHR16(a,shift) ((a) >> (shift))
+#define SHL16(a,shift) ((a) << (shift))
+#define SHR32(a,shift) ((a) >> (shift))
+#define SHL32(a,shift) ((a) << (shift))
+#define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift))
+#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift))
+#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
+#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
+#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
+
+#define SHR(a,shift) ((a) >> (shift))
+#define SHL(a,shift) ((ms_word32_t)(a) << (shift))
+#define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift))
+#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x)))
+
+
+#define ADD16(a,b) ((ms_word16_t)((ms_word16_t)(a)+(ms_word16_t)(b)))
+#define SUB16(a,b) ((ms_word16_t)(a)-(ms_word16_t)(b))
+#define ADD32(a,b) ((ms_word32_t)(a)+(ms_word32_t)(b))
+#define SUB32(a,b) ((ms_word32_t)(a)-(ms_word32_t)(b))
+
+
+/* result fits in 16 bits */
+#define MULT16_16_16(a,b)     ((((ms_word16_t)(a))*((ms_word16_t)(b))))
+
+/* (ms_word32_t)(ms_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */
+#define MULT16_16(a,b)     (((ms_word32_t)(ms_word16_t)(a))*((ms_word32_t)(ms_word16_t)(b)))
+
+#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b))))
+#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12))
+#define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13))
+#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14))
+
+#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))
+#define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)))
+
+#define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15))
+#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))
+#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)))
+
+
+#define MAC16_16_Q11(c,a,b)     (ADD32((c),SHR(MULT16_16((a),(b)),11)))
+#define MAC16_16_Q13(c,a,b)     (ADD32((c),SHR(MULT16_16((a),(b)),13)))
+#define MAC16_16_P13(c,a,b)     (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13)))
+
+#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11))
+#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13))
+#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14))
+#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15))
+
+#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13))
+#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14))
+#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15))
+
+#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15))
+
+#define DIV32_16(a,b) ((ms_word16_t)(((ms_word32_t)(a))/((ms_word16_t)(b))))
+#define PDIV32_16(a,b) ((ms_word16_t)(((ms_word32_t)(a)+((ms_word16_t)(b)>>1))/((ms_word16_t)(b))))
+#define DIV32(a,b) (((ms_word32_t)(a))/((ms_word32_t)(b)))
+#define PDIV32(a,b) (((ms_word32_t)(a)+((ms_word16_t)(b)>>1))/((ms_word32_t)(b)))
+
+#ifdef ARM5E_ASM
+#error "Fix me"
+#elif defined (ARM4_ASM)
+#error "Fix me"
+#elif defined (BFIN_ASM)
+
+#undef PDIV32_16
+static inline ms_word16_t PDIV32_16(ms_word32_t a, ms_word16_t b)
+{
+   ms_word32_t res, bb;
+   bb = b;
+   a += b>>1;
+   __asm__  (
+         "P0 = 15;\n\t"
+         "R0 = %1;\n\t"
+         "R1 = %2;\n\t"
+         //"R0 = R0 + R1;\n\t"
+         "R0 <<= 1;\n\t"
+         "DIVS (R0, R1);\n\t"
+         "LOOP divide%= LC0 = P0;\n\t"
+         "LOOP_BEGIN divide%=;\n\t"
+            "DIVQ (R0, R1);\n\t"
+         "LOOP_END divide%=;\n\t"
+         "R0 = R0.L;\n\t"
+         "%0 = R0;\n\t"
+   : "=m" (res)
+   : "m" (a), "m" (bb)
+   : "P0", "R0", "R1", "cc");
+   return res;
+}
+
+#undef DIV32_16
+static inline ms_word16_t DIV32_16(ms_word32_t a, ms_word16_t b)
+{
+   ms_word32_t res, bb;
+   bb = b;
+   /* Make the roundinf consistent with the C version 
+      (do we need to do that?)*/
+   if (a<0) 
+      a += (b-1);
+   __asm__  (
+         "P0 = 15;\n\t"
+         "R0 = %1;\n\t"
+         "R1 = %2;\n\t"
+         "R0 <<= 1;\n\t"
+         "DIVS (R0, R1);\n\t"
+         "LOOP divide%= LC0 = P0;\n\t"
+         "LOOP_BEGIN divide%=;\n\t"
+            "DIVQ (R0, R1);\n\t"
+         "LOOP_END divide%=;\n\t"
+         "R0 = R0.L;\n\t"
+         "%0 = R0;\n\t"
+   : "=m" (res)
+   : "m" (a), "m" (bb)
+   : "P0", "R0", "R1", "cc");
+   return res;
+}
+
+#undef MAX16
+static inline ms_word16_t MAX16(ms_word16_t a, ms_word16_t b)
+{
+   ms_word32_t res;
+   __asm__  (
+         "%1 = %1.L (X);\n\t"
+         "%2 = %2.L (X);\n\t"
+         "%0 = MAX(%1,%2);"
+   : "=d" (res)
+   : "%d" (a), "d" (b)
+   );
+   return res;
+}
+
+#undef MULT16_32_Q15
+static inline ms_word32_t MULT16_32_Q15(ms_word16_t a, ms_word32_t b)
+{
+   ms_word32_t res;
+   __asm__
+   (
+         "A1 = %2.L*%1.L (M);\n\t"
+         "A1 = A1 >>> 15;\n\t"
+         "%0 = (A1 += %2.L*%1.H) ;\n\t"
+   : "=&W" (res), "=&d" (b)
+   : "d" (a), "1" (b)
+   : "A1"
+   );
+   return res;
+}
+
+#undef MAC16_32_Q15
+static inline ms_word32_t MAC16_32_Q15(ms_word32_t c, ms_word16_t a, ms_word32_t b)
+{
+   ms_word32_t res;
+   __asm__
+         (
+         "A1 = %2.L*%1.L (M);\n\t"
+         "A1 = A1 >>> 15;\n\t"
+         "%0 = (A1 += %2.L*%1.H);\n\t"
+         "%0 = %0 + %4;\n\t"
+   : "=&W" (res), "=&d" (b)
+   : "d" (a), "1" (b), "d" (c)
+   : "A1"
+         );
+   return res;
+}
+
+#undef MULT16_32_Q14
+static inline ms_word32_t MULT16_32_Q14(ms_word16_t a, ms_word32_t b)
+{
+   ms_word32_t res;
+   __asm__
+         (
+         "%2 <<= 1;\n\t"
+         "A1 = %1.L*%2.L (M);\n\t"
+         "A1 = A1 >>> 15;\n\t"
+         "%0 = (A1 += %1.L*%2.H);\n\t"
+   : "=W" (res), "=d" (a), "=d" (b)
+   : "1" (a), "2" (b)
+   : "A1"
+         );
+   return res;
+}
+
+#undef MAC16_32_Q14
+static inline ms_word32_t MAC16_32_Q14(ms_word32_t c, ms_word16_t a, ms_word32_t b)
+{
+   ms_word32_t res;
+   __asm__
+         (
+         "%1 <<= 1;\n\t"
+         "A1 = %2.L*%1.L (M);\n\t"
+         "A1 = A1 >>> 15;\n\t"
+         "%0 = (A1 += %2.L*%1.H);\n\t"
+         "%0 = %0 + %4;\n\t"
+   : "=&W" (res), "=&d" (b)
+   : "d" (a), "1" (b), "d" (c)
+   : "A1"
+         );
+   return res;
+}
+
+
+
+#endif
+
+
+
+#else
+
+typedef float ms_mem_t;
+typedef float ms_coef_t;
+typedef float ms_lsp_t;
+typedef float ms_sig_t;
+typedef float ms_word16_t;
+typedef float ms_word32_t;
+
+#define Q15ONE 1.0f
+#define LPC_SCALING  1.f
+#define SIG_SCALING  1.f
+#define LSP_SCALING  1.f
+#define GAMMA_SCALING 1.f
+#define GAIN_SCALING 1.f
+#define GAIN_SCALING_1 1.f
+
+
+#define VERY_SMALL 1e-15f
+#define VERY_LARGE32 1e15f
+#define VERY_LARGE16 1e15f
+#define Q15_ONE ((ms_word16_t)1.f)
+
+#define QCONST16(x,bits) (x)
+#define QCONST32(x,bits) (x)
+
+#define NEG16(x) (-(x))
+#define NEG32(x) (-(x))
+#define EXTRACT16(x) (x)
+#define EXTEND32(x) (x)
+#define SHR16(a,shift) (a)
+#define SHL16(a,shift) (a)
+#define SHR32(a,shift) (a)
+#define SHL32(a,shift) (a)
+#define PSHR16(a,shift) (a)
+#define PSHR32(a,shift) (a)
+#define VSHR32(a,shift) (a)
+#define SATURATE16(x,a) (x)
+#define SATURATE32(x,a) (x)
+
+#define PSHR(a,shift)       (a)
+#define SHR(a,shift)       (a)
+#define SHL(a,shift)       (a)
+#define SATURATE(x,a) (x)
+
+#define ADD16(a,b) ((a)+(b))
+#define SUB16(a,b) ((a)-(b))
+#define ADD32(a,b) ((a)+(b))
+#define SUB32(a,b) ((a)-(b))
+#define MULT16_16_16(a,b)     ((a)*(b))
+#define MULT16_16(a,b)     ((ms_word32_t)(a)*(ms_word32_t)(b))
+#define MAC16_16(c,a,b)     ((c)+(ms_word32_t)(a)*(ms_word32_t)(b))
+
+#define MULT16_32_Q11(a,b)     ((a)*(b))
+#define MULT16_32_Q13(a,b)     ((a)*(b))
+#define MULT16_32_Q14(a,b)     ((a)*(b))
+#define MULT16_32_Q15(a,b)     ((a)*(b))
+#define MULT16_32_P15(a,b)     ((a)*(b))
+
+#define MAC16_32_Q11(c,a,b)     ((c)+(a)*(b))
+#define MAC16_32_Q15(c,a,b)     ((c)+(a)*(b))
+
+#define MAC16_16_Q11(c,a,b)     ((c)+(a)*(b))
+#define MAC16_16_Q13(c,a,b)     ((c)+(a)*(b))
+#define MAC16_16_P13(c,a,b)     ((c)+(a)*(b))
+#define MULT16_16_Q11_32(a,b)     ((a)*(b))
+#define MULT16_16_Q13(a,b)     ((a)*(b))
+#define MULT16_16_Q14(a,b)     ((a)*(b))
+#define MULT16_16_Q15(a,b)     ((a)*(b))
+#define MULT16_16_P15(a,b)     ((a)*(b))
+#define MULT16_16_P13(a,b)     ((a)*(b))
+#define MULT16_16_P14(a,b)     ((a)*(b))
+
+#define DIV32_16(a,b)     (((ms_word32_t)(a))/(ms_word16_t)(b))
+#define PDIV32_16(a,b)     (((ms_word32_t)(a))/(ms_word16_t)(b))
+#define DIV32(a,b)     (((ms_word32_t)(a))/(ms_word32_t)(b))
+#define PDIV32(a,b)     (((ms_word32_t)(a))/(ms_word32_t)(b))
+
+
+#endif
+
+#define MIN16(a,b) ((a) < (b) ? (a) : (b))   /**< Maximum 16-bit value.   */
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/*abstraction layer over kiss fft, taken from speex as well*/
+
+/** Compute tables for an FFT */
+void *ms_fft_init(int size);
+
+/** Destroy tables for an FFT */
+void ms_fft_destroy(void *table);
+
+/** Forward (real to half-complex) transform */
+void ms_fft(void *table, ms_word16_t *in, ms_word16_t *out);
+
+/** Backward (half-complex to real) transform */
+void ms_ifft(void *table, ms_word16_t *in, ms_word16_t *out);
+
+/** digital filtering api*/
+void ms_fir_mem16(const ms_word16_t *x, const ms_coef_t *num, ms_word16_t *y, int N, int ord, ms_mem_t *mem);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dtls_srtp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dtls_srtp.h"
new file mode 100755
index 0000000..e85fa93
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dtls_srtp.h"
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ms_dtls_srtp_h
+#define ms_dtls_srtp_h
+
+#include <ortp/rtpsession.h>
+#include "mediastreamer2/mscommon.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/* defined in mediastream.h */
+struct _MSMediaStreamSessions;
+
+typedef enum {
+	MSDtlsSrtpRoleInvalid,
+	MSDtlsSrtpRoleIsServer,
+	MSDtlsSrtpRoleIsClient,
+	MSDtlsSrtpRoleUnset
+} MSDtlsSrtpRole;
+
+typedef struct MSDtlsSrtpParams {
+	const char *pem_certificate; /**< Self certificate in pem format */
+	const char *pem_pkey; /**< Private key associated to self certificate */
+	MSDtlsSrtpRole role; /**< Unset(at caller init, role is then choosen by responder but we must still be able to receive packets) */
+	int mtu;
+} MSDtlsSrtpParams;
+
+/* an opaque structure containing all context data needed by DTLS-SRTP */
+typedef struct _MSDtlsSrtpContext MSDtlsSrtpContext;
+
+/**
+ * check if DTLS-SRTP is available
+ * @return TRUE if it is available, FALSE if not
+ */
+MS2_PUBLIC bool_t ms_dtls_srtp_available(void);
+
+/**
+ * Create an initialise a DTLS-SRTP context
+ * @param[in]	sessions	A link to the stream sessions structures, used to get rtp session to add transport modifier and needed to set SRTP sessions when keys are ready
+ * @param[in]	params		Self certificate and private key to be used for this session. Role (client/server) may be given but can be set later
+ * @return	a pointer to the opaque context structure needed by DTLS-SRTP
+ */
+MS2_PUBLIC MSDtlsSrtpContext* ms_dtls_srtp_context_new(struct _MSMediaStreamSessions *sessions, MSDtlsSrtpParams *params);
+
+/**
+ * Start the DTLS-SRTP channel: send DTLS ClientHello if we are client
+ * @param[in/out]	context		the DTLS-SRTP context
+ */
+MS2_PUBLIC void ms_dtls_srtp_start(MSDtlsSrtpContext* context);
+
+/**
+ * Free ressources used by DTLS-SRTP context
+ * @param[in/out]	context		the DTLS-SRTP context
+ */
+MS2_PUBLIC void ms_dtls_srtp_context_destroy(MSDtlsSrtpContext *ctx);
+
+/**
+ * Set DTLS role: server or client, called when SDP exchange reach the point where we can determine self role
+ * @param[in/out]	context		the DTLS-SRTP context
+ * @param[in]		role		Client/Server/Invalid/Unset according to SDP INVITE processing
+ */
+MS2_PUBLIC void ms_dtls_srtp_set_role(MSDtlsSrtpContext *context, MSDtlsSrtpRole role);
+
+/**
+ * Give to the DTLS-SRTP context the peer certificate fingerprint extracted from trusted SDP INVITE,
+ * it will be compared(case insensitive) with locally computed one after DTLS handshake is completed successfully and peer certicate retrieved
+ * @param[in/out]	context			the DTLS-SRTP context
+ * @param[in]		peer_fingerprint	a null terminated string containing the peer certificate as found in the SDP INVITE(including the heading hash algorithm name)
+ */
+MS2_PUBLIC void ms_dtls_srtp_set_peer_fingerprint(MSDtlsSrtpContext *context, const char *peer_fingerprint);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ms_dtls_srtp_h */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dtmfgen.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dtmfgen.h"
new file mode 100755
index 0000000..a379ca6
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/dtmfgen.h"
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef dtmfgen_h
+#define dtmfgen_h
+
+#include <mediastreamer2/msfilter.h>
+
+#define MS_DTMF_GEN_PUT		MS_FILTER_METHOD(MS_DTMF_GEN_ID,0,const char)
+/** Plays dtmf tone given in argument with default duration*/
+
+#define MS_DTMF_GEN_PLAY		MS_FILTER_METHOD(MS_DTMF_GEN_ID,0,const char) /*alias to put*/
+
+/**Start playing a given dtmf, then it has to be stopped using MS_DTMF_GEN_STOP */
+#define MS_DTMF_GEN_START		MS_FILTER_METHOD(MS_DTMF_GEN_ID,1,const char)
+
+/**Stop currently played dtmf*/
+#define MS_DTMF_GEN_STOP		MS_FILTER_METHOD_NO_ARG(MS_DTMF_GEN_ID,2)
+
+/**
+ * Structure describing a custom tone.
+**/
+struct _MSDtmfGenCustomTone{
+	char tone_name[8];	/**<Tone name for convenience*/
+	int duration;		/**<Duration of the tone in milliseconds*/
+	int frequencies[2];	/**<Frequencies of the tone to be played */
+	float amplitude;	/**<Amplitude of the tone, 1.0 being the 0dbm normalized level*/
+	int interval;		/**<Interval 'between tones' in milliseconds*/
+	int repeat_count;	/**<Number of times the tone is repeated.*/
+};
+
+typedef struct _MSDtmfGenCustomTone MSDtmfGenCustomTone;
+
+/**Play a custom tone according to the supplied tone description*/
+#define MS_DTMF_GEN_PLAY_CUSTOM	MS_FILTER_METHOD(MS_DTMF_GEN_ID,3,MSDtmfGenCustomTone)
+
+/**Sets default amplitude for dtmfs, expressed in the 0..1 range*/
+#define MS_DTMF_GEN_SET_DEFAULT_AMPLITUDE MS_FILTER_METHOD(MS_DTMF_GEN_ID,4,float)
+
+
+/**
+ * Structure carried by MS_DTMF_GEN_EVENT
+**/
+struct _MSDtmfGenEvent{
+	uint64_t tone_start_time;
+	char tone_name[8];
+};
+
+typedef struct _MSDtmfGenEvent MSDtmfGenEvent;
+
+/**
+ * Event sent by the filter each time a tone or dtmf is generated.
+**/
+#define MS_DTMF_GEN_EVENT		MS_FILTER_EVENT(MS_DTMF_GEN_ID,0,MSDtmfGenEvent)
+
+extern MSFilterDesc ms_dtmf_gen_desc;
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/flowcontrol.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/flowcontrol.h"
new file mode 100755
index 0000000..34efa49
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/flowcontrol.h"
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef flowcontrol_h
+#define flowcontrol_h
+
+
+
+typedef struct _MSAudioFlowController {
+	uint32_t target_samples;
+	uint32_t total_samples;
+	uint32_t current_pos;
+	uint32_t current_dropped;
+} MSAudioFlowController;
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+MS2_PUBLIC void ms_audio_flow_controller_init(MSAudioFlowController *ctl);
+
+MS2_PUBLIC void ms_audio_flow_controller_set_target(MSAudioFlowController *ctl, uint32_t samples_to_drop, uint32_t total_samples);
+
+MS2_PUBLIC mblk_t *ms_audio_flow_controller_process(MSAudioFlowController *ctl, mblk_t *m);
+
+
+/**
+ * Structure carried by MS_AUDIO_FLOW_CONTROL_DROP_EVENT
+**/
+typedef struct _MSAudioFlowControlDropEvent{
+	uint32_t flow_control_interval_ms;
+	uint32_t drop_ms;
+} MSAudioFlowControlDropEvent;
+
+/**
+ * Event sent by the filter each time some samples need to be dropped.
+**/
+#define MS_AUDIO_FLOW_CONTROL_DROP_EVENT MS_FILTER_EVENT(MS_AUDIO_FLOW_CONTROL_ID, 0, MSAudioFlowControlDropEvent)
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/formats.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/formats.h"
new file mode 100755
index 0000000..b3a56f0
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/formats.h"
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msformats_h
+#define msformats_h
+
+#include "mediastreamer2/mscommon.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Simple enum to indicate whether a format is audio or video.
+**/
+typedef enum _MSFormatType{
+	MSAudio,
+	MSVideo,
+	MSText,
+	MSUnknownMedia
+}MSFormatType;
+
+/**
+ * to string from enum.
+**/
+MS2_PUBLIC const char* ms_format_type_to_string(MSFormatType type);
+
+
+
+/* those structs are part of the ABI: don't change their size otherwise binary plugins will be broken*/
+
+typedef struct MSVideoSize{
+	int width,height;
+} MSVideoSize;
+
+
+/**
+ * Structure describing fully a media format.
+**/
+struct _MSFmtDescriptor{
+	MSFormatType type; /**<format type, audio or video*/
+	char *encoding; /**<the name of the encoding: for example pcmu, H264, opus*/
+	int nchannels; /**<number of channels, relevant for audio only*/
+	int rate; /**<Samplerate for audio, clockrate for video*/
+	char *fmtp; /**<fmtp*/
+	MSVideoSize vsize; /**<video size*/
+	float fps; /**<average framerate*/
+	char *text; /**<do not use directly, use ms_fmt_descriptor_to_string() instead*/
+};
+
+typedef struct _MSFmtDescriptor MSFmtDescriptor;
+
+MS2_PUBLIC const char *ms_fmt_descriptor_to_string(const MSFmtDescriptor *orig);
+
+MS2_PUBLIC bool_t ms_fmt_descriptor_equals(const MSFmtDescriptor *fmt1, const MSFmtDescriptor *fmt2);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/ice.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/ice.h"
new file mode 100755
index 0000000..de39f5a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/ice.h"
@@ -0,0 +1,946 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ice_h
+#define ice_h
+
+#include <mediastreamer2/mscommon.h>
+#include <mediastreamer2/stun.h>
+#include <ortp/ortp.h>
+
+
+/**
+ * @file ice.h
+ * @brief mediastreamer2 ice.h include file
+ *
+ * This file provides the API to handle the ICE protocol defined in the RFC 5245.
+ */
+
+
+/**
+ * The maximum number of check lists in an ICE session.
+ */
+#define ICE_SESSION_MAX_CHECK_LISTS 8
+
+
+/**
+ * ICE agent role.
+ *
+ * See the terminology in paragraph 3 of the RFC 5245 for more details.
+ */
+typedef enum {
+	IR_Controlling,
+	IR_Controlled
+} IceRole;
+
+/**
+ * ICE candidate type.
+ *
+ * See the terminology in paragraph 3 of the RFC 5245 for more details.
+ */
+typedef enum {
+	ICT_CandidateInvalid = -1,
+	ICT_HostCandidate,
+	ICT_ServerReflexiveCandidate,
+	ICT_PeerReflexiveCandidate,
+	ICT_RelayedCandidate,
+	ICT_CandidateTypeMax
+} IceCandidateType;
+
+/**
+ * ICE candidate pair state.
+ *
+ * See paragraph 5.7.4 ("Computing states") of RFC 5245 for more details.
+ */
+typedef enum {
+	ICP_Waiting,
+	ICP_InProgress,
+	ICP_Succeeded,
+	ICP_Failed,
+	ICP_Frozen
+} IceCandidatePairState;
+
+/**
+ * ICE check list state.
+ *
+ * See paragraph 5.7.4 ("Computing states") of RFC 5245 for more details.
+ */
+typedef enum {
+	ICL_Running,
+	ICL_Completed,
+	ICL_Failed
+} IceCheckListState;
+
+/**
+ * ICE session state.
+ */
+typedef enum {
+	IS_Stopped,
+	IS_Running,
+	IS_Completed,
+	IS_Failed
+} IceSessionState;
+
+struct _IceCheckList;
+
+/**
+ * Structure representing an ICE session.
+ */
+typedef struct _IceSession {
+	struct _IceCheckList * streams[ICE_SESSION_MAX_CHECK_LISTS];	/**< Table of IceChecklist structure pointers. Each element represents a media stream */
+	MSStunAuthRequestedCb stun_auth_requested_cb;	/**< Callback called when authentication is requested */
+	void *stun_auth_requested_userdata;	/**< Userdata to pass to the STUN authentication requested callback */
+	char *local_ufrag;	/**< Local username fragment for the session (assigned during the session creation) */
+	char *local_pwd;	/**< Local password for the session (assigned during the session creation) */
+	char *remote_ufrag;	/**< Remote username fragment for the session (provided via SDP by the peer) */
+	char *remote_pwd;	/**< Remote password for the session (provided via SDP by the peer) */
+	IceRole role;	/**< Role played by the agent for this session */
+	IceSessionState state;	/**< State of the session */
+	uint64_t tie_breaker;	/**< Random number used to resolve role conflicts (see paragraph 5.2 of the RFC 5245) */
+	int32_t ta;	/**< Duration of timer for sending connectivity checks in ms */
+	int event_value;	/** Value of the event to send */
+	MSTimeSpec event_time;	/**< Time when an event must be sent */
+	struct sockaddr_storage ss;	/**< STUN server address to use for the candidates gathering process */
+	socklen_t ss_len;	/**< Length of the STUN server address to use for the candidates gathering process */
+	MSTimeSpec gathering_start_ts;
+	MSTimeSpec gathering_end_ts;
+	MSTimeSpec connectivity_checks_start_ts;
+	IceCandidateType default_types[ICT_CandidateTypeMax];
+	bool_t check_message_integrity; /*set to false for backward compatibility only*/
+	bool_t send_event;	/**< Boolean value telling whether an event must be sent or not */
+	uint8_t max_connectivity_checks;	/**< Configuration parameter to limit the number of connectivity checks performed by the agent (default is 100) */
+	uint8_t keepalive_timeout;	/**< Configuration parameter to define the timeout between each keepalive packets (default is 15s) */
+	bool_t forced_relay;	/**< Force use of relay by modifying the local and reflexive candidates */
+	bool_t turn_enabled;	/**< TURN protocol enabled */
+	bool_t short_turn_refresh;	/**< Short TURN refresh for tests */
+} IceSession;
+
+typedef struct _IceStunServerRequestTransaction {
+	UInt96 transactionID;
+	MSTimeSpec request_time;
+	MSTimeSpec response_time;
+} IceStunServerRequestTransaction;
+
+typedef struct _IceStunServerRequest {
+	struct _IceCheckList *cl;
+	RtpTransport *rtptp;
+	MSTurnContext *turn_context;
+	struct addrinfo *source_ai;
+	MSList *transactions;	/**< List of IceStunServerRequestTransaction structures. */
+	MSTimeSpec next_transmission_time;
+	MSStunAddress peer_address;
+	uint16_t channel_number;
+	uint16_t stun_method;
+	uint8_t requested_address_family;
+	bool_t gathering;
+	bool_t responded;
+	bool_t to_remove;
+} IceStunServerRequest;
+
+typedef struct _IceStunRequestRoundTripTime {
+	int nb_responses;
+	int sum;
+} IceStunRequestRoundTripTime;
+
+/**
+ * Structure representing an ICE transport address.
+ */
+typedef struct _IceTransportAddress {
+	char ip[64];
+	int port;
+	int family;
+	// TODO: Handling of transport type: TCP, UDP...
+} IceTransportAddress;
+
+/**
+ * Structure representing an ICE candidate.
+ */
+typedef struct _IceCandidate {
+	char foundation[32];	/**< Foundation of the candidate (see paragraph 3 of the RFC 5245 for more details */
+	IceTransportAddress taddr;	/**< Transport address of the candidate */
+	IceCandidateType type;	/**< Type of the candidate */
+	uint32_t priority;	/**< Priority of the candidate */
+	uint16_t componentID;	/**< component ID between 1 and 256: usually 1 for RTP component and 2 for RTCP component */
+	struct _IceCandidate *base;	/**< Pointer to the candidate that is the base of the current one */
+	bool_t is_default;	/**< Boolean value telling whether this candidate is a default candidate or not */
+} IceCandidate;
+
+/**
+ * Structure representing an ICE candidate pair.
+ */
+typedef struct _IceCandidatePair {
+	IceRole role;	/**< Role of the agent when the connectivity check has been sent for the candidate pair */
+	IceCandidate *local;	/**< Pointer to the local candidate of the pair */
+	IceCandidate *remote;	/**< Pointer to the remote candidate of the pair */
+	IceCandidatePairState state;	/**< State of the candidate pair */
+	uint64_t priority;	/**< Priority of the candidate pair */
+	MSTimeSpec transmission_time;	/**< Time when the connectivity check for the candidate pair has been sent */
+	int32_t rto;	/**< Duration of the retransmit timer for the connectivity check sent for the candidate pair in ms */
+	uint8_t retransmissions;	/**< Number of retransmissions for the connectivity check sent for the candidate pair */
+	bool_t is_default;	/**< Boolean value telling whether this candidate pair is a default candidate pair or not */
+	bool_t use_candidate;	/**< Boolean value telling if the USE-CANDIDATE attribute must be set for the connectivity checks send for the candidate pair */
+	bool_t is_nominated;	/**< Boolean value telling whether this candidate pair is nominated or not */
+	bool_t nomination_pending; /** Boolean value telling whether this candidate pair was nominated by the remote (in controlled mode), but we could not yet complete the check*/
+	bool_t has_canceled_transaction;	/**< Boolean value telling that the pair has a cancelled transaction, see RFC5245 7.2.1.4.  Triggered Checks */
+	bool_t nomination_failing; /**<Boolean that indicates that this pair was nominated but it is apparently failing because no response is received.*/
+	bool_t retry_with_dummy_message_integrity; /** use to tell to retry with dummy message integrity. Useful to keep backward compatibility with older version*/
+	bool_t use_dummy_hmac; /*don't compute real hmac. used for backward compatibility*/
+} IceCandidatePair;
+
+/**
+ * Structure representing the foundation of an ICE candidate pair.
+ *
+ * It is the concatenation of the foundation of a local candidate and the foundation of a remote candidate.
+ */
+typedef struct _IcePairFoundation {
+	char local[32];	/**< Foundation of the local candidate */
+	char remote[32];	/**< Foundation of the remote candidate */
+} IcePairFoundation;
+
+typedef struct _IceValidCandidatePair {
+	IceCandidatePair *valid;	/**< Pointer to a valid candidate pair (it may be in the check list or not */
+	IceCandidatePair *generated_from;	/**< Pointer to the candidate pair that generated the connectivity check producing the valid candidate pair */
+	MSTimeSpec last_keepalive; /**< Time at which last keepalive was sent*/
+	bool_t selected;	/**< Boolean value telling whether this valid candidate pair has been selected or not */
+} IceValidCandidatePair;
+
+typedef struct _IceTransaction {
+	UInt96 transactionID;	/**< Transaction ID of the connectivity check sent for the candidate pair */
+	IceCandidatePair *pair;	/**< A pointer to the candidate pair associated with the transaction. */
+	int canceled;
+} IceTransaction;
+
+/**
+ * Structure representing an ICE check list.
+ *
+ * Each media stream must be assigned a check list.
+ * Check lists are added to an ICE session using the ice_session_add_check_list() function.
+ */
+typedef struct _IceCheckList {
+	IceSession *session;	/**< Pointer to the ICE session */
+	MSTurnContext *rtp_turn_context;	/**< TURN context for RTP socket */
+	MSTurnContext *rtcp_turn_context;	/**< TURN context for RTCP socket */
+	RtpSession *rtp_session;	/**< Pointer to the RTP session associated with this ICE check list */
+	char *remote_ufrag;	/**< Remote username fragment for this check list (provided via SDP by the peer) */
+	char *remote_pwd;	/**< Remote password for this check list (provided via SDP by the peer) */
+	MSList *stun_server_requests;	/**< List of IceStunServerRequest structures */
+	MSList *local_candidates;	/**< List of IceCandidate structures */
+	MSList *remote_candidates;	/**< List of IceCandidate structures */
+	MSList *pairs;	/**< List of IceCandidatePair structures */
+	MSList *losing_pairs;	/**< List of IceCandidatePair structures */
+	MSList *triggered_checks_queue;	/**< List of IceCandidatePair structures */
+	MSList *check_list;	/**< List of IceCandidatePair structures */
+	MSList *valid_list;	/**< List of IceValidCandidatePair structures */
+	MSList *foundations;	/**< List of IcePairFoundation structures */
+	MSList *local_componentIDs;	/**< List of uint16_t */
+	MSList *remote_componentIDs;	/**< List of uint16_t */
+	MSList *transaction_list;	/**< List of IceTransaction structures */
+	IceCheckListState state;	/**< Global state of the ICE check list */
+	MSTimeSpec ta_time;	/**< Time when the Ta timer has been processed for the last time */
+	MSTimeSpec keepalive_time;	/**< Time when the last keepalive packet has been sent for this stream */
+	uint32_t foundation_generator;	/**< Autoincremented integer to generate unique foundation values */
+	MSTimeSpec gathering_start_time;	/**< Time when the gathering process was started */
+	MSTimeSpec nomination_delay_start_time;	/**< Time when the nomination process has been delayed */
+	IceStunRequestRoundTripTime rtt;
+	bool_t mismatch;	/**< Boolean value telling whether there was a mismatch during the answer/offer process */
+	bool_t gathering_candidates;	/**< Boolean value telling whether a candidate gathering process is running or not */
+	bool_t gathering_finished;	/**< Boolean value telling whether the candidate gathering process has finished or not */
+	bool_t nomination_delay_running;	/**< Boolean value telling whether the nomination process has been delayed or not */
+	bool_t connectivity_checks_running; /**<Boolean to indicate that check list processing is in progress */
+	bool_t nomination_in_progress; /**<substate between ICL_Running and ICL_Completed, when the USE-CANDIDATE requests are waiting for their responses*/
+} IceCheckList;
+
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Allocate a new ICE session.
+ *
+ * @return Pointer to the allocated session
+ *
+ * This must be performed for each media session that is to use ICE.
+ */
+MS2_PUBLIC IceSession * ice_session_new(void);
+
+
+/**
+ * Set the prefered type for default candidates, as defined in rfc5245#section-4.1.4.
+ * The type table can be terminated by the ICT_CandidateInvalid element, may it contain less elements
+ * than the number of types available.
+ **/
+MS2_PUBLIC void ice_session_set_default_candidates_types(IceSession *session,
+					const IceCandidateType types[ICT_CandidateTypeMax]);
+/**
+ * Destroy a previously allocated ICE session.
+ *
+ * @param session The session to destroy.
+ *
+ * To be used when a media session using ICE is tore down.
+ */
+MS2_PUBLIC void ice_session_destroy(IceSession *session);
+
+/**
+ * Allocate a new ICE check list.
+ *
+ * @return Pointer to the allocated check list
+ *
+ * A check list must be allocated for each media stream of a media session and be added to an ICE session using the ice_session_add_check_list() function.
+ */
+MS2_PUBLIC IceCheckList * ice_check_list_new(void);
+
+/**
+ * Destroy a previously allocated ICE check list.
+ *
+ * @param cl The check list to destroy
+ */
+MS2_PUBLIC void ice_check_list_destroy(IceCheckList *cl);
+
+/**
+ * Tell whether ICE local candidates have been gathered for an ICE check list or not.
+ *
+ * @param cl A pointer to a check list
+ * @return TRUE if local candidates have been gathered for the check list, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t ice_check_list_candidates_gathered(const IceCheckList *cl);
+
+/**
+ * Get the nth check list of an ICE session.
+ *
+ * @param session A pointer to a session
+ * @param n The number of the check list to access
+ * @return A pointer to the nth check list of the session if it exists, NULL otherwise
+ */
+MS2_PUBLIC IceCheckList *ice_session_check_list(const IceSession *session, int n);
+
+/**
+ * Get the local username fragment of an ICE session.
+ *
+ * @param session A pointer to a session
+ * @return A pointer to the local username fragment of the session
+ */
+MS2_PUBLIC const char * ice_session_local_ufrag(const IceSession *session);
+
+/**
+ * Get the local password of an ICE session.
+ *
+ * @param session A pointer to a session
+ * @return A pointer to the local password of the session
+ */
+MS2_PUBLIC const char * ice_session_local_pwd(const IceSession *session);
+
+/**
+ * Get the remote username fragment of an ICE session.
+ *
+ * @param session A pointer to a session
+ * @return A pointer to the remote username fragment of the session
+ */
+MS2_PUBLIC const char * ice_session_remote_ufrag(const IceSession *session);
+
+/**
+ * Get the remote password of an ICE session.
+ *
+ * @param session A pointer to a session
+ * @return A pointer to the remote password of the session
+ */
+MS2_PUBLIC const char * ice_session_remote_pwd(const IceSession *session);
+
+/**
+ * Get the state of an ICE session.
+ *
+ * @param session A pointer to a session
+ * @return The state of the session
+ */
+MS2_PUBLIC IceSessionState ice_session_state(const IceSession *session);
+
+/**
+ * Get the role of the agent for an ICE session.
+ *
+ * @param session A pointer to a session
+ * @return The role of the agent for the session
+ */
+MS2_PUBLIC IceRole ice_session_role(const IceSession *session);
+
+/**
+ * Set the role of the agent for an ICE session.
+ *
+ * @param session The session for which to set the role
+ * @param role The role to set the session to
+ */
+MS2_PUBLIC void ice_session_set_role(IceSession *session, IceRole role);
+
+/**
+ * Set the local credentials of an ICE session.
+ *
+ * This function SHOULD not be used. However, it is used by mediastream for testing purpose to
+ * apply the same credentials for local and remote agents because the SDP exchange is bypassed.
+ */
+MS2_PUBLIC void ice_session_set_local_credentials(IceSession *session, const char *ufrag, const char *pwd);
+
+/**
+ * Tell if remote credentials of an ICE session have changed or not.
+ *
+ * @param session A pointer to a session
+ * @param ufrag The new remote username fragment
+ * @param pwd The new remote password
+ * @return TRUE if the remote credentials of the session have changed, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t ice_session_remote_credentials_changed(IceSession *session, const char *ufrag, const char *pwd);
+
+/**
+ * Set the remote credentials of an ICE session.
+ *
+ * @param session A pointer to a session
+ * @param ufrag The remote username fragment
+ * @param pwd The remote password
+ *
+ * This function is to be called once the remote credentials have been received via SDP.
+ */
+MS2_PUBLIC void ice_session_set_remote_credentials(IceSession *session, const char *ufrag, const char *pwd);
+
+/**
+ * get the remote ufrag of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ *
+ * This function is to be called once the remote credentials have been received via SDP.
+ */
+MS2_PUBLIC const char* ice_check_list_get_remote_ufrag(const IceCheckList *cl);
+
+/**
+ * get the remote pwd of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ *
+ * This function is to be called once the remote credentials have been received via SDP.
+ */
+MS2_PUBLIC const char* ice_check_list_get_remote_pwd(const IceCheckList *cl);
+
+/**
+ * Define the maximum number of connectivity checks that will be performed by the agent.
+ *
+ * @param session A pointer to a session
+ * @param max_connectivity_checks The maximum number of connectivity checks to perform
+ *
+ * This function is to be called just after the creation of the session, before any connectivity check is performed.
+ * The default number of connectivity checks is 100.
+ */
+MS2_PUBLIC void ice_session_set_max_connectivity_checks(IceSession *session, uint8_t max_connectivity_checks);
+
+/**
+ * Define the timeout between each keepalive packet in seconds.
+ *
+ * @param session A pointer to a session
+ * @param timeout The duration of the keepalive timeout in seconds
+ *
+ * The default keepalive timeout is set to 15 seconds.
+ */
+MS2_PUBLIC void ice_session_set_keepalive_timeout(IceSession *session, uint8_t timeout);
+
+/**
+ * Get the number of check lists in an ICE session.
+ *
+ * @param session A pointer to a session
+ * @return The number of check lists in the ICE session
+ */
+MS2_PUBLIC int ice_session_nb_check_lists(IceSession *session);
+
+/**
+ * Tell whether an ICE session has at least one completed check list.
+ *
+ * @param session A pointer to a session
+ * @return TRUE if the session has at least one completed check list, FALSE otherwise
+ */
+MS2_PUBLIC bool_t ice_session_has_completed_check_list(const IceSession *session);
+
+/**
+ * Add an ICE check list to an ICE session.
+ *
+ * @param session The session that is assigned the check list
+ * @param cl The check list to assign to the session
+ * @param idx The index of the check list to add
+ */
+MS2_PUBLIC void ice_session_add_check_list(IceSession *session, IceCheckList *cl, unsigned int idx);
+
+/**
+ * Remove an ICE check list from an ICE session.
+ *
+ * @param session The session from which to remove the check list
+ * @param cl The check list to remove from the session
+ */
+MS2_PUBLIC void ice_session_remove_check_list(IceSession *session, IceCheckList *cl);
+
+/**
+ * Remove an ICE check list from an ICE session given its index.
+ *
+ * @param session The session from which to remove the check list
+ * @param idx The index of the check list in the ICE session
+ */
+MS2_PUBLIC void ice_session_remove_check_list_from_idx(IceSession *session, unsigned int idx);
+
+/**
+ * Tell whether ICE local candidates have been gathered for an ICE session or not.
+ *
+ * @param session A pointer to a session
+ * @return TRUE if local candidates have been gathered for the session, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t ice_session_candidates_gathered(const IceSession *session);
+
+/**
+ * Gather ICE local candidates for an ICE session.
+ *
+ * @param session A pointer to a session
+ * @param ss The STUN server address
+ * @param ss_len The length of the STUN server address
+ * @return TRUE if the gathering is in progress, FALSE if no gathering is happening.
+ */
+MS2_PUBLIC bool_t ice_session_gather_candidates(IceSession *session, const struct sockaddr * ss, socklen_t ss_len);
+
+/**
+ * Tell the duration of the gathering process for an ICE session in ms.
+ *
+ * @param session A pointer to a session
+ * @return -1 if gathering has not been run, the duration of the gathering process in ms otherwise.
+ */
+MS2_PUBLIC int ice_session_gathering_duration(IceSession *session);
+
+/**
+ * Enable forced relay for tests.
+ * The local and reflexive candidates are changed so that these paths do not work to force the use of the relay.
+ * @param session A pointer to a session.
+ * @param enable A boolean value telling whether to force relay or not.
+ */
+MS2_PUBLIC void ice_session_enable_forced_relay(IceSession *session, bool_t enable);
+
+/**
+ * Enable short TURN refresh for tests.
+ * This changes the delay to send allocation refresh, create permission, and channel bind requests.
+ * @param session A pointer to a session
+ * @param enable A boolean value telling whether to use short turn refresh.
+ */
+MS2_PUBLIC void ice_session_enable_short_turn_refresh(IceSession *session, bool_t enable);
+
+/**
+ * Enable TURN protol.
+ * @param session A pointer to a session
+ * @param enable A boolean value telling whether to enable TURN protocol or not.
+ */
+MS2_PUBLIC void ice_session_enable_turn(IceSession *session, bool_t enable);
+
+MS2_PUBLIC void ice_session_set_stun_auth_requested_cb(IceSession *session, MSStunAuthRequestedCb cb, void *userdata);
+
+/**
+ * Tell the average round trip time during the gathering process for an ICE session in ms.
+ *
+ * @param session A pointer to a session
+ * @return -1 if gathering has not been run, the average round trip time in ms otherwise.
+ */
+MS2_PUBLIC int ice_session_average_gathering_round_trip_time(IceSession *session);
+
+/**
+ * Select ICE candidates that will be used and notified in the SDP.
+ *
+ * @param session A pointer to a session
+ *
+ * This function is to be used by the Controlling agent when ICE processing has finished.
+ */
+MS2_PUBLIC void ice_session_select_candidates(IceSession *session);
+
+/**
+ * Restart an ICE session.
+ *
+ * @param session A pointer to a session
+ * @param role The role of the agent after the session restart
+ */
+MS2_PUBLIC void ice_session_restart(IceSession *session, IceRole role);
+
+/**
+ * Reset an ICE session.
+ * It has the same effect as a session restart but also clears the local candidates.
+ * 
+ * @param session A pointer to a session
+ * @param role The role of the agent after the session restart
+ */
+MS2_PUBLIC void ice_session_reset(IceSession *session, IceRole role);
+
+/**
+ * Get the state of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @return The check list state
+ */
+MS2_PUBLIC IceCheckListState ice_check_list_state(const IceCheckList *cl);
+
+/**
+ * Set the state of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param state The new state of the check list
+ */
+MS2_PUBLIC void ice_check_list_set_state(IceCheckList *cl, IceCheckListState state);
+/**
+ * Humanly readable IceCheckListState
+ *
+ * @param state The state of the check list
+ * @return a humanly readable IceCheckListState.
+ */
+MS2_PUBLIC const char* ice_check_list_state_to_string(const IceCheckListState state);
+/**
+ * Assign an RTP session to an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param rtp_session A pointer to the RTP session to assign to the check list
+ */
+MS2_PUBLIC void ice_check_list_set_rtp_session(IceCheckList *cl, RtpSession *rtp_session);
+
+/**
+ * Get the local username fragment of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @return A pointer to the local username fragment of the check list
+ */
+MS2_PUBLIC const char * ice_check_list_local_ufrag(const IceCheckList *cl);
+
+/**
+ * Get the local password of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @return A pointer to the local password of the check list
+ */
+MS2_PUBLIC const char * ice_check_list_local_pwd(const IceCheckList *cl);
+
+/**
+ * Get the remote username fragment of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @return A pointer to the remote username fragment of the check list
+ */
+MS2_PUBLIC const char * ice_check_list_remote_ufrag(const IceCheckList *cl);
+
+/**
+ * Get the remote password of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @return A pointer to the remote password of the check list
+ */
+MS2_PUBLIC const char * ice_check_list_remote_pwd(const IceCheckList *cl);
+
+/**
+ * Get the mismatch property of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @return TRUE if there was a mismatch for the check list, FALSE otherwise
+ */
+MS2_PUBLIC bool_t ice_check_list_is_mismatch(const IceCheckList *cl);
+
+/**
+ * Tell if remote credentials of an ICE check list have changed or not.
+ *
+ * @param cl A pointer to a check list
+ * @param ufrag The new remote username fragment
+ * @param pwd The new remote password
+ * @return TRUE if the remote credentials of the check list have changed, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t ice_check_list_remote_credentials_changed(IceCheckList *cl, const char *ufrag, const char *pwd);
+
+/**
+ * Set the remote credentials of an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param ufrag The remote username fragment
+ * @param pwd The remote password
+ *
+ * This function is to be called once the remote credentials have been received via SDP.
+ */
+MS2_PUBLIC void ice_check_list_set_remote_credentials(IceCheckList *cl, const char *ufrag, const char *pwd);
+
+/**
+ * Get the default local candidate for an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param rtp_candidate A pointer to store the RTP default local candidate
+ * @param rtcp_candidate A pointer to store the RTCP default local candidate
+ * @return TRUE if the information have been successfully retrieved, FALSE otherwise
+ */
+MS2_PUBLIC bool_t ice_check_list_default_local_candidate(const IceCheckList *cl, IceCandidate **rtp_candidate, IceCandidate **rtcp_candidate);
+
+/**
+ * Get the selected valid local candidate for an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param rtp_candidate A pointer to store the RTP valid local candidate
+ * @param rtcp_candidate A pointer to store the RTCP valid local candidate
+ * @return TRUE if the information have been successfully retrieved, FALSE otherwise
+ */
+MS2_PUBLIC bool_t ice_check_list_selected_valid_local_candidate(const IceCheckList *cl, IceCandidate **rtp_candidate, IceCandidate **rtcp_candidate);
+
+/**
+ * Get the selected valid remote candidate for an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param rtp_candidate A pointer to store the RTP valid remote candidate
+ * @param rtcp_candidate A pointer to store the RTCP valid remote candidate
+ * @return TRUE if the information have been successfully retrieved, FALSE otherwise
+ */
+MS2_PUBLIC bool_t ice_check_list_selected_valid_remote_candidate(const IceCheckList *cl, IceCandidate **rtp_candidate, IceCandidate **rtcp_candidate);
+
+/**
+ * Get the type of the selected valid candidate for an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @return The type of the selected valid candidate
+ */
+MS2_PUBLIC IceCandidateType ice_check_list_selected_valid_candidate_type(const IceCheckList *cl);
+
+/**
+ * Check if an ICE check list can be set in the Completed state after handling losing pairs.
+ *
+ * @param cl A pointer to a check list
+ */
+MS2_PUBLIC void ice_check_list_check_completed(IceCheckList *cl);
+
+/**
+ * Get the candidate type as a string.
+ *
+ * @param candidate A pointer to a candidate
+ * @return A pointer to the candidate type as a string
+ */
+MS2_PUBLIC const char * ice_candidate_type(const IceCandidate *candidate);
+
+/**
+ * Add a local candidate to an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param type The type of the local candidate to add as a string (must be one of: "host", "srflx", "prflx" or "relay")
+ * @param family The address family of the local candidate (AF_INET or AF_INET6)
+ * @param ip The IP address of the local candidate as a string (eg. 192.168.0.10)
+ * @param port The port of the local candidate
+ * @param componentID The component ID of the local candidate (usually 1 for RTP and 2 for RTCP)
+ * @param base A pointer to the base candidate of the candidate to add.
+ *
+ * This function is to be called when gathering local candidates.
+ */
+MS2_PUBLIC IceCandidate * ice_add_local_candidate(IceCheckList *cl, const char *type, int family, const char *ip, int port, uint16_t componentID, IceCandidate *base);
+
+/**
+ * Add a remote candidate to an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param type The type of the remote candidate to add as a string (must be one of: "host", "srflx", "prflx" or "relay")
+ * @param family The address family of the remote candidate (AF_INET or AF_INET6)
+ * @param ip The IP address of the remote candidate as a string (eg. 192.168.0.10)
+ * @param port The port of the remote candidate
+ * @param componentID The component ID of the remote candidate (usually 1 for RTP and 2 for RTCP)
+ * @param priority The priority of the remote candidate
+ * @param foundation The foundation of the remote candidate
+ * @param is_default Boolean value telling whether the remote candidate is a default candidate or not
+ *
+ * This function is to be called once the remote candidate list has been received via SDP.
+ */
+MS2_PUBLIC IceCandidate * ice_add_remote_candidate(IceCheckList *cl, const char *type, int family, const char *ip, int port, uint16_t componentID, uint32_t priority, const char * const foundation, bool_t is_default);
+
+/**
+ * Add a losing pair to an ICE check list.
+ *
+ * @param cl A pointer to a check list
+ * @param componentID The component ID of the candidates of the pair to add
+ * @param family The address family of the candidates (AF_INET or AF_INET6)
+ * @param local_addr The address of the local candidate of the pair to add
+ * @param local_port The port of the local candidate of the pair to add
+ * @param remote_addr The address of the remote candidate of the pair to add
+ * @param remote_port The port of the remote candidate of the pair to add
+ *
+ * This function is to be called when a RE-INVITE with an SDP containing a remote-candidates attribute is received.
+ */
+MS2_PUBLIC void ice_add_losing_pair(IceCheckList *cl, uint16_t componentID, int local_family, const char *local_addr, int local_port, int remote_family, const char *remote_addr, int remote_port);
+
+/**
+ * Get the number of losing candidate pairs for an ICE session.
+ *
+ * @param session A pointer to a session
+ * @return The number of losing candidate pairs for the session.
+ */
+MS2_PUBLIC int ice_session_nb_losing_pairs(const IceSession *session);
+
+
+/**
+ * Set the base for the local server reflexive candidates of an ICE session.
+ *
+ * This function SHOULD not be used. However, it is used by mediastream for testing purpose to
+ * work around the fact that it does not use candidates gathering.
+ * It is to be called automatically when the gathering process finishes.
+ */
+MS2_PUBLIC void ice_session_set_base_for_srflx_candidates(IceSession *session);
+
+/**
+ * Remove local and remote RTCP candidates from an ICE check list.
+ * 
+ * @param cl A pointer to a check list
+ *
+ * This function MUST be called before calling ice_session_start_connectivity_checks(). It is useful when using rtcp-mux.
+ */
+MS2_PUBLIC void ice_check_list_remove_rtcp_candidates(IceCheckList *cl);
+
+/**
+ * Compute the foundations of the local candidates of an ICE session.
+ *
+ * @param session A pointer to a session
+ *
+ * This function is to be called at the end of the local candidates gathering process, before sending
+ * the SDP to the remote agent.
+ */
+MS2_PUBLIC void ice_session_compute_candidates_foundations(IceSession *session);
+
+/**
+ * Eliminate the redundant candidates of an ICE session.
+ *
+ * @param session A pointer to a session
+ *
+ * This function is to be called at the end of the local candidates gathering process, before sending
+ * the SDP to the remote agent.
+ */
+MS2_PUBLIC void ice_session_eliminate_redundant_candidates(IceSession *session);
+
+/**
+ * Choose the default candidates of an ICE session.
+ *
+ * @param session A pointer to a session
+ *
+ * This function is to be called at the end of the local candidates gathering process, before sending
+ * the SDP to the remote agent.
+ */
+MS2_PUBLIC void ice_session_choose_default_candidates(IceSession *session);
+
+/**
+ * Choose the default remote candidates of an ICE session.
+ *
+ * This function SHOULD not be used. Instead, the default remote candidates MUST be defined as default
+ * when creating them with ice_add_remote_candidate().
+ * However, this function is used by mediastream for testing purpose.
+ */
+MS2_PUBLIC void ice_session_choose_default_remote_candidates(IceSession *session);
+
+/**
+ * Pair the local and the remote candidates for an ICE session and start sending connectivity checks.
+ *
+ * @param session A pointer to a session
+ */
+MS2_PUBLIC void ice_session_start_connectivity_checks(IceSession *session);
+
+/**
+ * Check whether all the ICE check lists of the session includes a default candidate for each component ID in its remote candidates list.
+ *
+ * @param session A pointer to a session
+ */
+MS2_PUBLIC void ice_session_check_mismatch(IceSession *session);
+
+
+/**
+ * Disable/enable strong message integrity check. Used for backward compatibility only
+ * default value is enabled
+ * @param session A pointer to a session
+ * @param enable value
+ *
+ */
+MS2_PUBLIC void ice_session_enable_message_integrity_check(IceSession *session,bool_t enable);
+
+/**
+ * Core ICE check list processing.
+ *
+ * This function is called from the audiostream or the videostream and is NOT to be called by the user.
+ */
+void ice_check_list_process(IceCheckList* cl, RtpSession* rtp_session);
+
+/**
+ * Handle a STUN packet that has been received.
+ *
+ * This function is called from the audiostream or the videostream and is NOT to be called by the user.
+ */
+void ice_handle_stun_packet(IceCheckList* cl, RtpSession* rtp_session, const OrtpEventData* evt_data);
+
+/**
+ * Get the remote address, RTP port and RTCP port to use to send the stream once the ICE process has finished successfully.
+ *
+ * @param cl A pointer to a check list
+ * @param rtp_addr A pointer to the buffer to use to store the remote RTP address
+ * @param rtp_port A pointer to the location to store the RTP port to
+ * @param rtcp_addr A pointer to the buffer to use to store the remote RTCP address
+ * @param rtcp_port A pointer to the location to store the RTCP port to
+ * @param addr_len The size of the buffer to use to store the remote addresses
+ *
+ * This function will usually be called from within the success callback defined while creating the ICE check list with ice_check_list_new().
+ */
+MS2_PUBLIC void ice_get_remote_addr_and_ports_from_valid_pairs(const IceCheckList *cl, char *rtp_addr, int *rtp_port, char *rtcp_addr, int *rtcp_port, int addr_len);
+
+/**
+ * Print the route used to send the stream if the ICE process has finished successfully.
+ *
+ * @param cl A pointer to a check list
+ * @param message A message to print before the route
+ */
+MS2_PUBLIC void ice_check_list_print_route(const IceCheckList *cl, const char *message);
+
+/**
+ * Dump an ICE session in the traces (debug function).
+ */
+MS2_PUBLIC void ice_dump_session(const IceSession *session);
+
+/**
+ * Dump the candidates of an ICE check list in the traces (debug function).
+ */
+MS2_PUBLIC void ice_dump_candidates(const IceCheckList *cl);
+
+/**
+ * Dump the candidate pairs of an ICE check list in the traces (debug function).
+ */
+MS2_PUBLIC void ice_dump_candidate_pairs(const IceCheckList *cl);
+
+/**
+ * Dump the valid list of an ICE check list in the traces (debug function).
+ */
+MS2_PUBLIC void ice_dump_valid_list(const IceCheckList *cl);
+
+/**
+ * Dump the list of candidate pair foundations of an ICE check list in the traces (debug function).
+ */
+MS2_PUBLIC void ice_dump_candidate_pairs_foundations(const IceCheckList *cl);
+
+/**
+ * Dump the list of component IDs of an ICE check list in the traces (debug function).
+ */
+MS2_PUBLIC void ice_dump_componentIDs(const IceCheckList *cl);
+
+/**
+ * Dump an ICE check list in the traces (debug function).
+ */
+MS2_PUBLIC void ice_dump_check_list(const IceCheckList *cl);
+
+/**
+ * Dump the triggered checks queue of an ICE check list in the traces (debug function).
+ */
+MS2_PUBLIC void ice_dump_triggered_checks_queue(const IceCheckList *cl);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mediastream.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mediastream.h"
new file mode 100755
index 0000000..97626a1
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mediastream.h"
@@ -0,0 +1,1347 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef MEDIASTREAM_H
+#define MEDIASTREAM_H
+
+#include <ortp/ortp.h>
+#include <ortp/event.h>
+#include <ortp/nack.h>
+
+#include <mediastreamer2/msfactory.h>
+#include <mediastreamer2/msfilter.h>
+#include <mediastreamer2/msticker.h>
+#include <mediastreamer2/mssndcard.h>
+#include <mediastreamer2/mswebcam.h>
+#include <mediastreamer2/msvideo.h>
+#include <mediastreamer2/msvideoqualitycontroller.h>
+#include <mediastreamer2/bitratecontrol.h>
+#include <mediastreamer2/qualityindicator.h>
+#include <mediastreamer2/ice.h>
+#include <mediastreamer2/zrtp.h>
+#include <mediastreamer2/dtls_srtp.h>
+#include <mediastreamer2/ms_srtp.h>
+#include <mediastreamer2/msequalizer.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @addtogroup ring_api
+ * @{
+**/
+
+struct _RingStream
+{
+	MSSndCard *card;
+	MSTicker *ticker;
+	MSFilter *source;
+	MSFilter *gendtmf;
+	MSFilter *write_resampler;
+	MSFilter *sndwrite;
+	MSFilter *decoder;
+	int srcpin;
+};
+
+typedef struct _RingStream RingStream;
+
+MS2_PUBLIC RingStream *ring_start(MSFactory *factory, const char * file, int interval, MSSndCard *sndcard);
+MS2_PUBLIC RingStream *ring_start_with_cb(MSFactory *factory, const char * file, int interval, MSSndCard *sndcard, MSFilterNotifyFunc func, void * user_data);
+MS2_PUBLIC void ring_stop (RingStream * stream);
+
+/**
+ * @}
+**/
+/**
+ * The MediaStream is an object describing a stream (one of AudioStream or VideoStream).
+**/
+typedef struct _MediaStream MediaStream;
+
+/*
+ * internal cb to process rtcp stream
+ * */
+typedef void (*media_stream_process_rtcp_callback_t)(MediaStream *stream, mblk_t *m);
+
+struct _MSMediaStreamSessions{
+	RtpSession *rtp_session;
+	MSSrtpCtx* srtp_context;
+	MSZrtpContext *zrtp_context;
+	MSDtlsSrtpContext *dtls_context;
+	MSTicker *ticker;
+};
+
+#ifndef MS_MEDIA_STREAM_SESSIONS_DEFINED
+typedef struct _MSMediaStreamSessions MSMediaStreamSessions;
+#define MS_MEDIA_STREAM_SESSIONS_DEFINED 1
+#endif
+
+MS2_PUBLIC void ms_media_stream_sessions_uninit(MSMediaStreamSessions *sessions);
+
+typedef enum _MSStreamState{
+	MSStreamInitialized,
+	MSStreamPreparing,
+	MSStreamStarted,
+	MSStreamStopped
+}MSStreamState;
+
+
+typedef enum MediaStreamDir{
+	MediaStreamSendRecv,
+	MediaStreamSendOnly,
+	MediaStreamRecvOnly
+}MediaStreamDir;
+
+/**
+ * Base struct for both AudioStream and VideoStream structure.
+**/
+struct _MediaStream {
+	MSFormatType type;
+	MSStreamState state;
+	MSMediaStreamSessions sessions;
+	OrtpEvQueue *evq;
+	MSFilter *rtprecv;
+	MSFilter *rtpsend;
+	MSFilter *encoder;
+	MSFilter *decoder;
+	MSFilter *voidsink;
+	MSBitrateController *rc;
+	MSQualityIndicator *qi;
+	IceCheckList *ice_check_list;
+	time_t start_time;
+	time_t last_iterate_time;
+	uint64_t last_packet_count;
+	time_t last_packet_time;
+	MSQosAnalyzerAlgorithm rc_algorithm;
+	PayloadType *current_pt;/*doesn't need to be freed*/
+	bool_t rc_enable;
+	bool_t is_beginning;
+	bool_t owns_sessions;
+	bool_t pad;
+	/**
+	 * defines encoder target network bit rate, uses #media_stream_set_target_network_bitrate() setter.
+	 * */
+	int target_bitrate;
+	int max_target_bitrate;
+	media_stream_process_rtcp_callback_t process_rtcp;
+	OrtpEvDispatcher *evd;
+	MSFactory *factory;
+	MSBandwidthController *bandwidth_controller;
+	MSVideoQualityController *video_quality_controller;
+};
+
+MS2_PUBLIC void media_stream_init(MediaStream *stream, MSFactory *factory, const MSMediaStreamSessions *sessions);
+
+MS2_PUBLIC MSFactory* media_stream_get_factory(MediaStream *stream);
+
+/**
+ * @addtogroup audio_stream_api
+ * @{
+**/
+
+MS2_PUBLIC bool_t media_stream_started(MediaStream *stream);
+
+MS2_PUBLIC int media_stream_join_multicast_group(MediaStream *stream, const char *ip);
+
+MS2_PUBLIC bool_t media_stream_dtls_supported(void);
+
+/* enable DTLS on the media stream */
+MS2_PUBLIC void media_stream_enable_dtls(MediaStream *stream, const MSDtlsSrtpParams *params);
+
+MS2_PUBLIC void media_stream_set_rtcp_information(MediaStream *stream, const char *cname, const char *tool);
+
+MS2_PUBLIC void media_stream_get_local_rtp_stats(MediaStream *stream, rtp_stats_t *stats);
+
+MS2_PUBLIC int media_stream_set_dscp(MediaStream *stream, int dscp);
+
+MS2_PUBLIC void media_stream_enable_adaptive_bitrate_control(MediaStream *stream, bool_t enabled);
+
+MS2_PUBLIC void media_stream_set_adaptive_bitrate_algorithm(MediaStream *stream, MSQosAnalyzerAlgorithm algorithm);
+
+MS2_PUBLIC void media_stream_enable_adaptive_jittcomp(MediaStream *stream, bool_t enabled);
+
+MS2_PUBLIC void media_stream_set_ice_check_list(MediaStream *stream, IceCheckList *cl);
+
+/*
+ * deprecated, use media_stream_set_srtp_recv_key and media_stream_set_srtp_send_key.
+**/
+MS2_PUBLIC bool_t media_stream_enable_srtp(MediaStream* stream, MSCryptoSuite suite, const char* snd_key, const char* rcv_key);
+
+/**
+ * @param[in] stream MediaStream object
+ * @return true if stream is encrypted
+ * */
+MS2_PUBLIC bool_t media_stream_secured(const MediaStream *stream);
+#define media_stream_is_secured media_stream_secured
+
+/**
+ * Tells whether AVPF is enabled or not.
+ * @param[in] stream #MediaStream object.
+ * @return True if AVPF is enabled, false otherwise.
+ */
+MS2_PUBLIC bool_t media_stream_avpf_enabled(const MediaStream *stream);
+
+/**
+ * Gets the AVPF Regular RTCP report interval.
+ * @param[in] stream #MediaStream object.
+ * @return The AVPF Regular RTCP report interval in seconds.
+ */
+MS2_PUBLIC uint16_t media_stream_get_avpf_rr_interval(const MediaStream *stream);
+
+/**
+ * Gets the RTP session of the media stream.
+ * @param[in] stream #MediaStream object.
+ * @return The RTP session of the media stream.
+ */
+MS2_PUBLIC RtpSession * media_stream_get_rtp_session(const MediaStream *stream);
+
+MS2_PUBLIC const MSQualityIndicator *media_stream_get_quality_indicator(MediaStream *stream);
+/* *
+ * returns a realtime indicator of the stream quality between 0 and 5
+ * */
+MS2_PUBLIC float media_stream_get_quality_rating(MediaStream *stream);
+
+MS2_PUBLIC float media_stream_get_average_quality_rating(MediaStream *stream);
+
+MS2_PUBLIC float media_stream_get_lq_quality_rating(MediaStream *stream);
+
+MS2_PUBLIC float media_stream_get_average_lq_quality_rating(MediaStream *stream);
+
+/**
+ * <br>For multirate codecs like OPUS, encoder output target bitrate must be set.
+ * <br>Encoder will compute output codec bitrate from this value.
+ * <br> default value is the value corresponding the rtp PayloadType
+ * @param stream stream to apply parameter on
+ * @param target_bitrate in bit per seconds
+ * @return 0 if succeed
+ * */
+MS2_PUBLIC int media_stream_set_target_network_bitrate(MediaStream *stream,int target_bitrate);
+
+/**
+ * Set a maximum target bitrate for the stream. Indeed, the MSBandwidthController may adapt the target bitrate
+ * according to network conditions, which includes the possibility to increase it if remote side sends a TMMBR
+ * to invite to increase bitrate. The max_network_bitrate defines the upper limit for increasing the bitrate usage automatically.
+ * @param stream stream to apply parameter on
+ * @param target_bitrate in bit per seconds
+**/
+MS2_PUBLIC int media_stream_set_max_network_bitrate(MediaStream *stream,int max_bitrate);
+
+/**
+ * get the stream target bitrate.
+ * @param stream stream to apply parameter on
+ * @return target_bitrate in bit per seconds
+ * */
+MS2_PUBLIC int media_stream_get_target_network_bitrate(const MediaStream *stream);
+
+/**
+ * get current stream  upload bitrate. Value is updated every seconds
+ * @param stream
+ * @return bitrate in bit per seconds
+ * */
+MS2_PUBLIC float media_stream_get_up_bw(const MediaStream *stream);
+
+/**
+ * get current stream download bitrate. Value is updated every seconds
+ * @param stream
+ * @return bitrate in bit per seconds
+ * */
+MS2_PUBLIC float media_stream_get_down_bw(const MediaStream *stream);
+
+/**
+ * get current stream rtcp upload bitrate. Value is updated every seconds
+ * @param stream
+ * @return bitrate in bit per seconds
+ * */
+MS2_PUBLIC float media_stream_get_rtcp_up_bw(const MediaStream *stream);
+
+/**
+ * get current stream rtcp download bitrate. Value is updated every seconds
+ * @param stream
+ * @return bitrate in bit per seconds
+ * */
+MS2_PUBLIC float media_stream_get_rtcp_down_bw(const MediaStream *stream);
+
+/**
+ * Returns the sessions that were used in the media stream (RTP, SRTP, ZRTP...) so that they can be re-used.
+ * As a result of calling this function, the media stream no longer owns the sessions and thus will not free them.
+**/
+MS2_PUBLIC void media_stream_reclaim_sessions(MediaStream *stream, MSMediaStreamSessions *sessions);
+
+
+MS2_PUBLIC void media_stream_iterate(MediaStream * stream);
+
+/**
+ * Returns TRUE if stream was still actively receiving packets (RTP or RTCP) in the last period specified in timeout_seconds.
+**/
+MS2_PUBLIC bool_t media_stream_alive(MediaStream *stream, int timeout_seconds);
+
+/**
+ * @return current streams state
+ * */
+MS2_PUBLIC MSStreamState media_stream_get_state(const MediaStream *stream);
+
+MS2_PUBLIC OrtpEvDispatcher* media_stream_get_event_dispatcher(const MediaStream *stream);
+
+typedef enum EchoLimiterType{
+	ELInactive,
+	ELControlMic,
+	ELControlFull
+} EchoLimiterType;
+
+
+typedef enum EqualizerLocation {
+	MSEqualizerHP = 0,
+	MSEqualizerMic
+} EqualizerLocation;
+
+
+typedef enum MSResourceType{
+	MSResourceInvalid,
+	MSResourceDefault,
+	MSResourceFile,
+	MSResourceRtp,
+	MSResourceCamera,
+	MSResourceSoundcard
+}MSResourceType;
+
+MS2_PUBLIC const char *ms_resource_type_to_string(MSResourceType type);
+
+/**
+ * Structure describing the input or the output of a MediaStream.
+ * type must be set to one the member of the MSResourceType enum, and the correspoding
+ * resource argument must be set: the file name (const char*) for MSResourceFile,
+ * the RtpSession for MSResourceRtp, an MSWebCam for MSResourceCamera, an MSSndCard for MSResourceSoundcard.
+ * @warning due to implementation, if RTP is to be used for input and output, the same RtpSession must be passed for both sides.
+ */
+typedef struct _MSMediaResource{
+	MSResourceType type;
+	union{
+		void *resource_arg;
+		const char *file;
+		RtpSession *session;
+		MSWebCam *camera;
+		MSSndCard *soundcard;
+	};
+}MSMediaResource;
+
+
+MS2_PUBLIC bool_t ms_media_resource_is_consistent(const MSMediaResource *r);
+#define ms_media_resource_get_file(r)		(((r)->type == MSResourceFile) ? (r)->file : NULL)
+#define ms_media_resource_get_rtp_session(r)	(((r)->type == MSResourceRtp) ? (r)->session : NULL)
+#define ms_media_resource_get_camera(r)		(((r)->type == MSResourceCamera) ? (r)->camera : NULL)
+#define ms_media_resource_get_soundcard(r)	(((r)->type == MSResourceSoundcard) ? (r)->soundcard : NULL)
+/**
+ * Structure describing the input/output of a MediaStream.
+ * Input and output are described as MSMediaResource.
+ */
+typedef struct _MSMediaStreamIO {
+	MSMediaResource input;
+	MSMediaResource output;
+} MSMediaStreamIO;
+
+#define MS_MEDIA_STREAM_IO_INITIALIZER { {MSResourceInvalid}, {MSResourceInvalid} }
+
+MS2_PUBLIC bool_t ms_media_stream_io_is_consistent(const MSMediaStreamIO *io);
+
+struct _AudioStream
+{
+	MediaStream ms;
+	MSFilter *soundread;
+	MSFilter *soundwrite;
+	MSFilter *dtmfgen;
+	MSFilter *dtmfgen_rtp;
+	MSFilter *plc;
+	MSFilter *ec;/*echo canceler*/
+	MSFilter *volsend,*volrecv; /*MSVolumes*/
+	MSFilter *local_mixer;
+	MSFilter *local_player;
+	MSFilter *local_player_resampler;
+	MSFilter *read_decoder; /* Used when the input is done via RTP */
+	MSFilter *write_encoder; /* Used when the output is done via RTP */
+	MSFilter *read_resampler;
+	MSFilter *write_resampler;
+	MSFilter *mic_equalizer;
+	MSFilter *spk_equalizer;
+	MSFilter *dummy;
+	MSFilter *recv_tee;
+	MSFilter *recorder_mixer;
+	MSFilter *recorder;
+	MSFilter *outbound_mixer;
+	struct {
+		MSFilter *resampler;
+		MSFilter *encoder;
+		MSFilter *recorder;
+		MSFilter *video_input;
+	}av_recorder;
+	struct _AVPlayer{
+		MSFilter *player;
+		MSFilter *resampler;
+		MSFilter *decoder;
+		MSFilter *video_output;
+		int audiopin;
+		int videopin;
+		bool_t plumbed;
+	}av_player;
+	MSFilter *flowcontrol;
+	RtpSession *rtp_io_session; /**< The RTP session used for RTP input/output. */
+	MSFilter *vaddtx;
+	char *recorder_file;
+	EchoLimiterType el_type; /*use echo limiter: two MSVolume, measured input level controlling local output level*/
+	EqualizerLocation eq_loc;
+	uint32_t features;
+	int sample_rate;
+	int nchannels;
+	struct _VideoStream *videostream;/*the stream with which this audiostream is paired*/
+	MSAudioRoute audio_route;
+	bool_t play_dtmfs;
+	bool_t use_ec;
+	bool_t use_gc;
+	bool_t use_agc;
+
+	bool_t mic_eq_active;
+	bool_t spk_eq_active;
+	bool_t use_ng;/*noise gate*/
+	bool_t is_ec_delay_set;
+};
+
+/**
+ * The AudioStream holds all resources to create and run typical VoIP audiostream.
+**/
+typedef struct _AudioStream AudioStream;
+
+
+/* start a thread that does sampling->encoding->rtp_sending|rtp_receiving->decoding->playing */
+MS2_PUBLIC AudioStream *audio_stream_start(MSFactory* factory, RtpProfile * prof, int locport, const char *remip,
+				 int remport, int payload_type, int jitt_comp, bool_t echo_cancel);
+
+MS2_PUBLIC AudioStream *audio_stream_start_with_sndcards(MSFactory* factory, RtpProfile* prof, int locport, const char *remip4, int remport, int payload_type, int jitt_comp, MSSndCard *playcard,
+														 MSSndCard *captcard, bool_t echocancel);
+
+MS2_PUBLIC int audio_stream_start_with_files (AudioStream * stream, RtpProfile * prof,
+						const char *remip, int remport, int rem_rtcp_port,
+						int pt, int jitt_comp,
+						const char * infile,  const char * outfile);
+
+/**
+ * Start an audio stream according to the specified AudioStreamIO.
+ *
+ * @param[in] stream AudioStream object previously created with audio_stream_new().
+ * @param[in] profile RtpProfile object holding the PayloadType that can be used during the audio session.
+ * @param[in] rem_rtp_ip The remote IP address where to send the encoded audio to.
+ * @param[in] rem_rtp_port The remote port where to send the encoded audio to.
+ * @param[in] rem_rtcp_ip The remote IP address for RTCP.
+ * @param[in] rem_rtcp_port The remote port for RTCP.
+ * @param[in] payload_type The payload type number used to send the audio stream. A valid PayloadType must be available at this index in the profile.
+ * @param[in] io A MSMediaStreamIO describing the local input/output of the audio stream.
+ */
+MS2_PUBLIC int audio_stream_start_from_io(AudioStream *stream, RtpProfile *profile, const char *rem_rtp_ip, int rem_rtp_port,
+	const char *rem_rtcp_ip, int rem_rtcp_port, int payload_type, const MSMediaStreamIO *io);
+
+/**
+ * Starts an audio stream from/to local wav files or soundcards.
+ *
+ * This method starts the processing of the audio stream, that is playing from wav file or soundcard, voice processing, encoding,
+ * sending through RTP, receiving from RTP, decoding, voice processing and wav file recording or soundcard playback.
+ *
+ *
+ * @param stream an AudioStream previously created with audio_stream_new().
+ * @param profile a RtpProfile containing all PayloadType possible during the audio session.
+ * @param rem_rtp_ip remote IP address where to send the encoded audio.
+ * @param rem_rtp_port remote IP port where to send the encoded audio.
+ * @param rem_rtcp_ip remote IP address for RTCP.
+ * @param rem_rtcp_port remote port for RTCP.
+ * @param payload payload type index to use for the sending stream. This index must point to a valid PayloadType in the RtpProfile.
+ * @param jitt_comp Nominal jitter buffer size in milliseconds.
+ * @param infile path to wav file to play out (can be NULL)
+ * @param outfile path to wav file to record into (can be NULL)
+ * @param playcard The soundcard to be used for playback (can be NULL)
+ * @param captcard The soundcard to be used for catpure. (can be NULL)
+ * @param use_ec whether echo cancellation is to be performed.
+ * @return 0 if sucessful, -1 otherwise.
+**/
+MS2_PUBLIC int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char *rem_rtp_ip,int rem_rtp_port,
+	const char *rem_rtcp_ip, int rem_rtcp_port, int payload,int jitt_comp, const char *infile, const char *outfile,
+	MSSndCard *playcard, MSSndCard *captcard, bool_t use_ec);
+
+
+MS2_PUBLIC void audio_stream_play(AudioStream *st, const char *name);
+MS2_PUBLIC void audio_stream_record(AudioStream *st, const char *name);
+
+static MS2_INLINE void audio_stream_set_rtcp_information(AudioStream *st, const char *cname, const char *tool) {
+	media_stream_set_rtcp_information(&st->ms, cname, tool);
+}
+
+MS2_PUBLIC void audio_stream_play_received_dtmfs(AudioStream *st, bool_t yesno);
+
+/**
+ * Creates an AudioStream object listening on a RTP port.
+ * @param loc_rtp_port the local UDP port to listen for RTP packets.
+ * @param loc_rtcp_port the local UDP port to listen for RTCP packets
+ * @param ipv6 TRUE if ipv6 must be used.
+ * @param factory
+ * @return a new AudioStream.
+**/
+MS2_PUBLIC AudioStream *audio_stream_new(MSFactory* factory, int loc_rtp_port, int loc_rtcp_port, bool_t ipv6);
+
+/**
+ * Creates an AudioStream object listening on a RTP port for a dedicated address.
+ * @param loc_ip the local ip to listen for RTP packets. Can be ::, O.O.O.O or any ip4/6 addresses
+ * @param loc_rtp_port the local UDP port to listen for RTP packets.
+ * @param loc_rtcp_port the local UDP port to listen for RTCP packets
+ * @param factory
+ * @return a new AudioStream.
+**/
+MS2_PUBLIC AudioStream *audio_stream_new2(MSFactory* factory, const char* ip, int loc_rtp_port, int loc_rtcp_port);
+
+
+/**Creates an AudioStream object from initialized MSMediaStreamSessions.
+ * @param sessions the MSMediaStreamSessions
+ * @param factory the MSFActory from the core object
+ * @return a new AudioStream
+**/
+MS2_PUBLIC AudioStream *audio_stream_new_with_sessions(MSFactory* factory, const MSMediaStreamSessions *sessions);
+
+#define AUDIO_STREAM_FEATURE_PLC 		(1 << 0)
+#define AUDIO_STREAM_FEATURE_EC 		(1 << 1)
+#define AUDIO_STREAM_FEATURE_EQUALIZER		(1 << 2)
+#define AUDIO_STREAM_FEATURE_VOL_SND 		(1 << 3)
+#define AUDIO_STREAM_FEATURE_VOL_RCV 		(1 << 4)
+#define AUDIO_STREAM_FEATURE_DTMF		(1 << 5)
+#define AUDIO_STREAM_FEATURE_DTMF_ECHO		(1 << 6)
+#define AUDIO_STREAM_FEATURE_MIXED_RECORDING	(1 << 7)
+#define AUDIO_STREAM_FEATURE_LOCAL_PLAYING	(1 << 8)
+#define AUDIO_STREAM_FEATURE_REMOTE_PLAYING	(1 << 9)
+#define AUDIO_STREAM_FEATURE_FLOW_CONTROL	(1 << 10)
+
+#define AUDIO_STREAM_FEATURE_ALL	(\
+					AUDIO_STREAM_FEATURE_PLC | \
+					AUDIO_STREAM_FEATURE_EC | \
+					AUDIO_STREAM_FEATURE_EQUALIZER | \
+					AUDIO_STREAM_FEATURE_VOL_SND | \
+					AUDIO_STREAM_FEATURE_VOL_RCV | \
+					AUDIO_STREAM_FEATURE_DTMF | \
+					AUDIO_STREAM_FEATURE_DTMF_ECHO |\
+					AUDIO_STREAM_FEATURE_MIXED_RECORDING |\
+					AUDIO_STREAM_FEATURE_LOCAL_PLAYING | \
+					AUDIO_STREAM_FEATURE_REMOTE_PLAYING | \
+					AUDIO_STREAM_FEATURE_FLOW_CONTROL \
+					)
+
+
+MS2_PUBLIC uint32_t audio_stream_get_features(AudioStream *st);
+MS2_PUBLIC void audio_stream_set_features(AudioStream *st, uint32_t features);
+
+MS2_PUBLIC void audio_stream_prepare_sound(AudioStream *st, MSSndCard *playcard, MSSndCard *captcard);
+MS2_PUBLIC void audio_stream_unprepare_sound(AudioStream *st);
+MS2_PUBLIC bool_t audio_stream_started(AudioStream *stream);
+/**
+ * Starts an audio stream from local soundcards.
+ *
+ * This method starts the processing of the audio stream, that is capture from soundcard, voice processing, encoding,
+ * sending through RTP, receiving from RTP, decoding, voice processing and soundcard playback.
+ *
+ * @param stream an AudioStream previously created with audio_stream_new().
+ * @param prof a RtpProfile containing all PayloadType possible during the audio session.
+ * @param remip remote IP address where to send the encoded audio.
+ * @param remport remote IP port where to send the encoded audio
+ * @param rem_rtcp_port remote port for RTCP.
+ * @param payload_type payload type index to use for the sending stream. This index must point to a valid PayloadType in the RtpProfile.
+ * @param jitt_comp Nominal jitter buffer size in milliseconds.
+ * @param playcard The soundcard to be used for playback
+ * @param captcard The soundcard to be used for catpure.
+ * @param echo_cancel whether echo cancellation is to be performed.
+**/
+MS2_PUBLIC int audio_stream_start_now(AudioStream * stream, RtpProfile * prof,  const char *remip, int remport, int rem_rtcp_port, int payload_type, int jitt_comp,MSSndCard *playcard, MSSndCard *captcard, bool_t echo_cancel);
+MS2_PUBLIC void audio_stream_set_relay_session_id(AudioStream *stream, const char *relay_session_id);
+/*returns true if we are still receiving some data from remote end in the last timeout seconds*/
+MS2_PUBLIC bool_t audio_stream_alive(AudioStream * stream, int timeout);
+
+/**
+ * Executes background low priority tasks related to audio processing (RTP statistics analysis).
+ * It should be called periodically, for example with an interval of 100 ms or so.
+ */
+MS2_PUBLIC void audio_stream_iterate(AudioStream *stream);
+
+/**
+ * enable echo-limiter dispositve: one MSVolume in input branch controls a MSVolume in the output branch
+ * */
+MS2_PUBLIC void audio_stream_enable_echo_limiter(AudioStream *stream, EchoLimiterType type);
+
+/**
+ * enable gain control, to be done before start()
+ * */
+MS2_PUBLIC void audio_stream_enable_gain_control(AudioStream *stream, bool_t val);
+
+/**
+ * enable automatic gain control, to be done before start()
+ * */
+MS2_PUBLIC void audio_stream_enable_automatic_gain_control(AudioStream *stream, bool_t val);
+
+/**
+ * to be done before start
+ *  */
+MS2_PUBLIC void audio_stream_set_echo_canceller_params(AudioStream *st, int tail_len_ms, int delay_ms, int framesize);
+
+
+/**
+ * to be done before start
+ *  */
+MS2_PUBLIC void audio_stream_enable_echo_canceller(AudioStream *st, bool_t enabled);
+/**
+ * enable adaptive rate control
+ * */
+static MS2_INLINE void audio_stream_enable_adaptive_bitrate_control(AudioStream *stream, bool_t enabled) {
+	media_stream_enable_adaptive_bitrate_control(&stream->ms, enabled);
+}
+
+/**
+ *  Enable adaptive jitter compensation
+ *  */
+static MS2_INLINE void audio_stream_enable_adaptive_jittcomp(AudioStream *stream, bool_t enabled) {
+	media_stream_enable_adaptive_jittcomp(&stream->ms, enabled);
+}
+
+/**
+ * Apply a software gain on the microphone.
+ * Be note that this method neither changes the volume gain
+ * of the sound card nor the system mixer one. If you intends
+ * to control the volume gain at sound card level, you should
+ * use audio_stream_set_sound_card_input_gain() instead.
+ *
+ * @param stream The stream.
+ * @param gain_db Gain to apply in dB.
+ */
+MS2_PUBLIC void audio_stream_set_mic_gain_db(AudioStream *stream, float gain_db);
+
+
+/**
+ * Like audio_stream_set_mic_gain_db() excepted that the gain is specified
+ * in percentage.
+ *
+ * @param stream The stream.
+ * @param gain Gain to apply in percentage of the max supported gain.
+ */
+MS2_PUBLIC void audio_stream_set_mic_gain(AudioStream *stream, float gain);
+
+/**
+ *  enable/disable rtp stream
+ */
+MS2_PUBLIC void audio_stream_mute_rtp(AudioStream *stream, bool_t val);
+
+/**
+ * Apply a gain on received RTP packets.
+ * @param stream An AudioStream.
+ * @param gain_db Gain to apply in dB.
+ */
+MS2_PUBLIC void audio_stream_set_spk_gain_db(AudioStream *stream, float gain_db);
+
+/**
+ * Like audio_stream_set_spk_gain_db() excepted that the gain is specified
+ * in percentage.
+ *
+ * @param stream The stream.
+ * @param gain Gain to apply in percentage of the max supported gain.
+ */
+MS2_PUBLIC void audio_stream_set_spk_gain(AudioStream *stream, float gain);
+
+/**
+ * Set microphone volume gain.
+ * If the sound backend supports it, the set volume gain will be synchronized
+ * with the host system mixer. If you intended to apply a static software gain,
+ * you should use audio_stream_set_mic_gain_db() or audio_stream_set_mic_gain().
+ *
+ * @param stream The audio stream.
+ * @param gain Percentage of the max supported volume gain. Valid values are in [0.0 : 1.0].
+ */
+MS2_PUBLIC void audio_stream_set_sound_card_input_gain(AudioStream *stream, float gain);
+
+/**
+ * Get microphone volume gain.
+ * @param stream The audio stream.
+ * @return double Volume gain in percentage of the max suppored gain.
+ * Valid returned values are in [0.0 : 1.0]. A negative value is returned in case of failure.
+ */
+MS2_PUBLIC float audio_stream_get_sound_card_input_gain(const AudioStream *stream);
+
+/**
+ * Set speaker volume gain.
+ * If the sound backend supports it, the set volume gain will be synchronized
+ * with the host system mixer.
+ * @param stream The audio stream.
+ * @param gain Percentage of the max supported volume gain. Valid values are in [0.0 : 1.0].
+ */
+MS2_PUBLIC void audio_stream_set_sound_card_output_gain(AudioStream *stream, float volume);
+
+/**
+ * Get speaker volume gain.
+ * @param stream The audio stream.
+ * @return Volume gain in percentage of the max suppored gain.
+ * Valid returned values are in [0.0 : 1.0]. A negative value is returned in case of failure.
+ */
+MS2_PUBLIC float audio_stream_get_sound_card_output_gain(const AudioStream *stream);
+
+/**
+ * enable noise gate, must be done before start()
+ * */
+MS2_PUBLIC void audio_stream_enable_noise_gate(AudioStream *stream, bool_t val);
+
+/**
+ * Enable a parametric equalizer
+ * @param[in] stream An AudioStream
+ * @param[in] location Location of the equalizer to enable (speaker or microphone)
+ * @param[in] enabled Whether the equalizer must be enabled
+ */
+MS2_PUBLIC void audio_stream_enable_equalizer(AudioStream *stream, EqualizerLocation location, bool_t enabled);
+
+/**
+ * Apply a gain on a given frequency band.
+ * @param[in] stream An AudioStream
+ * @param[in] location Location of the concerned equalizer (speaker or microphone)
+ * @param[in] gain Description of the band and the gain to apply.
+ */
+MS2_PUBLIC void audio_stream_equalizer_set_gain(AudioStream *stream, EqualizerLocation location, const MSEqualizerGain *gain);
+
+/**
+ *  stop the audio streaming thread and free everything
+ *  */
+MS2_PUBLIC void audio_stream_stop (AudioStream * stream);
+
+/**
+ *  send a dtmf
+ *  */
+MS2_PUBLIC int audio_stream_send_dtmf (AudioStream * stream, char dtmf);
+
+MS2_PUBLIC MSFilter *audio_stream_get_local_player(AudioStream *stream);
+
+MS2_PUBLIC int audio_stream_mixed_record_open(AudioStream *st, const char*filename);
+
+MS2_PUBLIC int audio_stream_mixed_record_start(AudioStream *st);
+
+MS2_PUBLIC int audio_stream_mixed_record_stop(AudioStream *st);
+
+/**
+ * Open a player to play an audio/video file to remote end.
+ * The player is returned as a MSFilter so that application can make usual player controls on it using the MSPlayerInterface.
+**/
+MS2_PUBLIC MSFilter * audio_stream_open_remote_play(AudioStream *stream, const char *filename);
+
+MS2_PUBLIC void audio_stream_close_remote_play(AudioStream *stream);
+
+MS2_PUBLIC void audio_stream_set_default_card(int cardindex);
+
+/* retrieve RTP statistics*/
+static MS2_INLINE void audio_stream_get_local_rtp_stats(AudioStream *stream, rtp_stats_t *stats) {
+	media_stream_get_local_rtp_stats(&stream->ms, stats);
+}
+
+/* returns a realtime indicator of the stream quality between 0 and 5 */
+MS2_PUBLIC float audio_stream_get_quality_rating(AudioStream *stream);
+
+/* returns the quality rating as an average since the start of the streaming session.*/
+MS2_PUBLIC float audio_stream_get_average_quality_rating(AudioStream *stream);
+
+/* returns a realtime indicator of the listening quality of the stream between 0 and 5 */
+MS2_PUBLIC float audio_stream_get_lq_quality_rating(AudioStream *stream);
+
+/* returns the listening quality rating as an average since the start of the streaming session.*/
+MS2_PUBLIC float audio_stream_get_average_lq_quality_rating(AudioStream *stream);
+
+/* enable ZRTP on the audio stream */
+MS2_PUBLIC void audio_stream_enable_zrtp(AudioStream *stream, MSZrtpParams *params);
+MS2_PUBLIC void audio_stream_start_zrtp(AudioStream *stream);
+
+/**
+ * return TRUE if zrtp is enabled, it does not mean that stream is encrypted, but only that zrtp is configured to know encryption status, uses #
+ * */
+bool_t  audio_stream_zrtp_enabled(const AudioStream *stream);
+
+/* enable SRTP on the audio stream */
+static MS2_INLINE bool_t audio_stream_enable_srtp(AudioStream* stream, MSCryptoSuite suite, const char* snd_key, const char* rcv_key) {
+	return media_stream_enable_srtp(&stream->ms, suite, snd_key, rcv_key);
+}
+
+static MS2_INLINE int audio_stream_set_dscp(AudioStream *stream, int dscp) {
+	return media_stream_set_dscp(&stream->ms, dscp);
+}
+
+/**
+ * Gets the RTP session of an audio stream.
+ * @param[in] stream #MediaStream object.
+ * @return The RTP session of the audio stream.
+ */
+static MS2_INLINE RtpSession * audio_stream_get_rtp_session(const AudioStream *stream) {
+	return media_stream_get_rtp_session(&stream->ms);
+}
+
+
+
+/**
+ * @}
+**/
+
+
+/**
+ * @addtogroup video_stream_api
+ * @{
+**/
+
+typedef void (*VideoStreamRenderCallback)(void *user_pointer, const MSPicture *local_view, const MSPicture *remote_view);
+typedef void (*VideoStreamEventCallback)(void *user_pointer, const MSFilter *f, const unsigned int event_id, const void *args);
+
+struct _MediastreamVideoStat
+{
+    int counter_rcvd_pli; /*Picture Loss Indication counter */
+    int counter_rcvd_sli;/* Slice Loss Indication counter */
+    int counter_rcvd_rpsi; /*Reference Picture Selection Indication */
+    int counter_rcvd_fir; /* Full INTRA-frame Request */
+};
+
+typedef struct _MediastreamVideoStat MediaStreamVideoStat;
+
+struct _VideoStream
+{
+	MediaStream ms;
+	MSFilter *jpegwriter;
+	MSFilter *local_jpegwriter;
+	MSFilter *output;
+	MSFilter *output2;
+	MSFilter *pixconv;
+	MSFilter *qrcode;
+	MSFilter *recorder_output; /*can be an ItcSink to send video to the audiostream's multimedia recorder, or directly a MkvRecorder */
+	MSFilter *sizeconv;
+	MSFilter *source;
+	MSFilter *tee;
+	MSFilter *tee2;
+	MSFilter *tee3;
+	MSFilter *void_source;
+	MSVideoSize sent_vsize;
+	MSVideoSize preview_vsize;
+	float forced_fps; /*the target fps explicitely set by application, overrides internally selected fps*/
+	float configured_fps; /*the fps that was configured to the encoder. It might be different from the one really obtained from camera.*/
+	float real_fps; /*the fps obtained from camera.*/
+	int corner; /*for selfview*/
+	VideoStreamRenderCallback rendercb;
+	void *render_pointer;
+	VideoStreamEventCallback eventcb;
+	void *event_pointer;
+	char *display_name;
+	void *window_id;
+	void *preview_window_id;
+	MediaStreamDir dir;
+	MSRect decode_rect; //Used for the qrcode decoder
+	MSWebCam *cam;
+	RtpSession *rtp_io_session; /**< The RTP session used for RTP input/output. */
+	char *preset;
+	MSVideoConfiguration *vconf_list;
+	struct _AudioStream *audiostream;/*the audio stream with which this videostream is paired*/
+	OrtpNackContext *nack_context;
+	int device_orientation; /* warning: meaning of this variable depends on the platform (Android, iOS, ...) */
+	uint64_t last_reported_decoding_error_time;
+	uint64_t last_fps_check;
+	MediaStreamVideoStat ms_video_stat;
+	bool_t use_preview_window;
+	bool_t enable_qrcode_decoder;
+	bool_t freeze_on_error;
+	bool_t display_filter_auto_rotate_enabled;
+	bool_t source_performs_encoding;
+
+	bool_t output_performs_decoding;
+	bool_t player_active;
+	bool_t staticimage_webcam_fps_optimization; /* if TRUE, the StaticImage webcam will ignore the fps target in order to save CPU time. Default is TRUE */
+};
+
+typedef struct _VideoStream VideoStream;
+
+
+
+MS2_PUBLIC VideoStream *video_stream_new(MSFactory* factory, int loc_rtp_port, int loc_rtcp_port, bool_t use_ipv6);
+/**
+ * Creates a VideoStream object listening on a RTP port for a dedicated address.
+ * @param loc_ip the local ip to listen for RTP packets. Can be ::, O.O.O.O or any ip4/6 addresses
+ * @param [in] loc_rtp_port the local UDP port to listen for RTP packets.
+ * @param [in] loc_rtcp_port the local UDP port to listen for RTCP packets
+ * @return a new VideoStream.
+**/
+MS2_PUBLIC VideoStream *video_stream_new2(MSFactory* factory, const char* ip, int loc_rtp_port, int loc_rtcp_port);
+
+MS2_PUBLIC VideoStream *video_stream_new_with_sessions(MSFactory* factory, const MSMediaStreamSessions *sessions);
+MS2_PUBLIC void video_stream_set_direction(VideoStream *vs, MediaStreamDir dir);
+static MS2_INLINE void video_stream_enable_adaptive_bitrate_control(VideoStream *stream, bool_t enabled) {
+	media_stream_enable_adaptive_bitrate_control(&stream->ms, enabled);
+}
+static MS2_INLINE void video_stream_enable_adaptive_jittcomp(VideoStream *stream, bool_t enabled) {
+	media_stream_enable_adaptive_jittcomp(&stream->ms, enabled);
+}
+MS2_PUBLIC void video_stream_set_render_callback(VideoStream *s, VideoStreamRenderCallback cb, void *user_pointer);
+MS2_PUBLIC void video_stream_set_event_callback(VideoStream *s, VideoStreamEventCallback cb, void *user_pointer);
+MS2_PUBLIC void video_stream_set_display_filter_name(VideoStream *s, const char *fname);
+MS2_PUBLIC int video_stream_start_with_source(VideoStream *stream, RtpProfile *profile, const char *rem_rtp_ip, int rem_rtp_port,
+		const char *rem_rtcp_ip, int rem_rtcp_port, int payload, int jitt_comp, MSWebCam* cam, MSFilter* source);
+MS2_PUBLIC int video_stream_start(VideoStream * stream, RtpProfile *profile, const char *rem_rtp_ip, int rem_rtp_port, const char *rem_rtcp_ip,
+				  int rem_rtcp_port, int payload, int jitt_comp, MSWebCam *device);
+MS2_PUBLIC int video_stream_start_with_files(VideoStream *stream, RtpProfile *profile, const char *rem_rtp_ip, int rem_rtp_port,
+        const char *rem_rtcp_ip, int rem_rtcp_port, int payload_type, const char *play_file, const char *record_file);
+
+/**
+ * Start a video stream according to the specified VideoStreamIO.
+ *
+ * @param[in] stream VideoStream object previously created with video_stream_new().
+ * @param[in] profile RtpProfile object holding the PayloadType that can be used during the video session.
+ * @param[in] rem_rtp_ip The remote IP address where to send the encoded video to.
+ * @param[in] rem_rtp_port The remote port where to send the encoded video to.
+ * @param[in] rem_rtcp_ip The remote IP address for RTCP.
+ * @param[in] rem_rtcp_port The remote port for RTCP.
+ * @param[in] payload_type The payload type number used to send the video stream. A valid PayloadType must be available at this index in the profile.
+ * @param[in] io A VideoStreamIO describing the input/output of the video stream.
+ */
+MS2_PUBLIC int video_stream_start_from_io(VideoStream *stream, RtpProfile *profile, const char *rem_rtp_ip, int rem_rtp_port,
+	const char *rem_rtcp_ip, int rem_rtcp_port, int payload_type, const MSMediaStreamIO *io);
+
+MS2_PUBLIC void video_stream_prepare_video(VideoStream *stream);
+MS2_PUBLIC void video_stream_unprepare_video(VideoStream *stream);
+
+
+MS2_PUBLIC void video_stream_set_relay_session_id(VideoStream *stream, const char *relay_session_id);
+static MS2_INLINE void video_stream_set_rtcp_information(VideoStream *st, const char *cname, const char *tool) {
+	media_stream_set_rtcp_information(&st->ms, cname, tool);
+}
+/*
+ * returns current MSWebCam for a given stream
+ * */
+MS2_PUBLIC const MSWebCam * video_stream_get_camera(const VideoStream *stream);
+
+/**
+ * Returns the current video stream source filter. Be careful, this source will be
+ * destroyed if the stream is stopped.
+ * @return current stream source
+ */
+MS2_PUBLIC MSFilter* video_stream_get_source_filter(const VideoStream* stream);
+
+MS2_PUBLIC void video_stream_change_camera(VideoStream *stream, MSWebCam *cam);
+
+MS2_PUBLIC void video_stream_change_camera_skip_bitrate(VideoStream *stream, MSWebCam *cam);
+
+/**
+ * @brief This functions changes the source filter for the passed video stream.
+ * @details This is quite the same function as \ref video_stream_change_camera, but this one
+ * allows you to pass the source filter that is created for the camera and reuse it. This gives you the
+ * ability to switch rapidly between two streams, whereas re-creating them each time would be
+ * costly (especially with webcams).
+ *
+ * @note Since the \ref video_stream_stop() will automatically destroy the source, it is
+ *		advised that you use \ref video_stream_stop_keep_source() instead, so that you
+ *		can manually destroy the source filters after the stream is stopped.
+ *
+ * Example usage:
+ *
+ *		video_stream_start(stream, profile, [...], noWebcamDevice);
+ *		// We manage the sources for the stream ourselves:
+ *		MSFilter* noWebCamFilter = video_stream_get_source_filter(stream);
+ *		MSFilter* frontCamFilter = ms_web_cam_create_reader(frontCamDevice);
+ *
+ * 		sleep(1);
+ * 		video_stream_change_source_filter(stream, frontCamDevice, frontCamFilter, TRUE); // will keep the previous filter
+ * 		sleep(1);
+ * 		video_stream_change_source_filter(stream, noWebcamDevice, noWebCamFilter, TRUE); // keep the previous filter
+ *
+ *		sleep(1)
+ *		video_stream_stop_keep_source(stream);
+ *		ms_filter_destroy(noWebCamFilter);
+ *		ms_filter_destroy(frontCamFilter);
+ *
+ *
+ * @param stream the video stream to modify
+ * @param cam the camera that you want to set as the new source
+ * @param cam_filter the filter for this camera. It can be obtained with ms_web_cam_create_reader(cam)
+ * @return the previous source if keep_previous_source is TRUE, otherwise NULL
+ */
+MS2_PUBLIC MSFilter* video_stream_change_source_filter(VideoStream *stream, MSWebCam* cam, MSFilter* filter, bool_t keep_previous_source );
+
+/**
+ * @brief This is the same function as \ref video_stream_change_source_filter() called with keep_source=1, but
+ *  the new filter will be created from the MSWebcam that is passed as argument.
+ *
+ *  @param stream the video stream
+ *  @param cam the MSWebcam from which the new source filter should be created.
+ *  @return the previous source filter
+ */
+MS2_PUBLIC MSFilter* video_stream_change_camera_keep_previous_source(VideoStream *stream, MSWebCam *cam);
+
+
+/* Calling video_stream_set_sent_video_size() or changing the bitrate value in the used PayloadType during a stream is running does nothing.
+The following function allows to take into account new parameters by redrawing the sending graph*/
+MS2_PUBLIC void video_stream_update_video_params(VideoStream *stream);
+/*function to call periodically to handle various events */
+MS2_PUBLIC void video_stream_iterate(VideoStream *stream);
+
+/**
+ * Asks the video stream to send a Full-Intra Request.
+ * @param[in] stream The videostream object.
+ */
+MS2_PUBLIC void video_stream_send_fir(VideoStream *stream);
+
+/**
+ * Asks the video stream to generate a Video Fast Update (generally after receiving a Full-Intra Request.
+ * @param[in] stream The videostream object.
+ */
+MS2_PUBLIC void video_stream_send_vfu(VideoStream *stream);
+
+MS2_PUBLIC void video_stream_stop(VideoStream * stream);
+
+/**
+ * Stop the video stream, but does not destroy the source of the video. This function
+ * can be use in conjunction with \ref video_stream_change_source_filter() to allow
+ * manual management of the source filters for a video stream.
+ * @param stream the stream to stop
+ * @return returns the source of the video stream, which you should manually destroy when appropriate.
+ */
+MS2_PUBLIC MSFilter* video_stream_stop_keep_source(VideoStream * stream);
+
+MS2_PUBLIC bool_t video_stream_started(VideoStream *stream);
+
+/**
+ * Try to set the size of the video that is sent. Since this relies also on the
+ * bitrate specified, make sure to set the payload bitrate accordingly with
+ * rtp_profile_get_payload and normal_bitrate value otherwise the best
+ * possible resolution will be taken instead of the requested one.
+ * @param[in] stream The videostream for which to get the sent video size.
+ * @param[in] vsize The sent video size wished.
+ */
+MS2_PUBLIC void video_stream_set_sent_video_size(VideoStream *stream, MSVideoSize vsize);
+
+/**
+ * Gets the size of the video that is sent.
+ * @param[in] stream The videostream for which to get the sent video size.
+ * @return The sent video size or MS_VIDEO_SIZE_UNKNOWN if not available.
+ */
+MS2_PUBLIC MSVideoSize video_stream_get_sent_video_size(const VideoStream *stream);
+
+/**
+ * Gets the size of the video that is received.
+ * @param[in] stream The videostream for which to get the received video size.
+ * @return The received video size or MS_VIDEO_SIZE_UNKNOWN if not available.
+ */
+MS2_PUBLIC MSVideoSize video_stream_get_received_video_size(const VideoStream *stream);
+
+/**
+ * Gets the framerate of the video that is sent.
+ * @param[in] stream The videostream.
+ * @return The actual framerate, 0 if not available..
+ */
+MS2_PUBLIC float video_stream_get_sent_framerate(const VideoStream *stream);
+
+/**
+ * Gets the framerate of the video that is received.
+ * @param[in] stream The videostream.
+ * @return The received framerate or 0 if not available.
+ */
+MS2_PUBLIC float video_stream_get_received_framerate(const VideoStream *stream);
+
+MS2_PUBLIC void video_stream_enable_self_view(VideoStream *stream, bool_t val);
+MS2_PUBLIC void * video_stream_get_native_window_id(VideoStream *stream);
+MS2_PUBLIC void video_stream_set_native_window_id(VideoStream *stream, void *id);
+MS2_PUBLIC void video_stream_set_native_preview_window_id(VideoStream *stream, void *id);
+MS2_PUBLIC void * video_stream_get_native_preview_window_id(VideoStream *stream);
+MS2_PUBLIC void video_stream_use_preview_video_window(VideoStream *stream, bool_t yesno);
+MS2_PUBLIC void video_stream_set_device_rotation(VideoStream *stream, int orientation);
+MS2_PUBLIC void video_stream_show_video(VideoStream *stream, bool_t show);
+MS2_PUBLIC void video_stream_set_freeze_on_error(VideoStream *stream, bool_t yesno);
+
+/**
+ * @brief Gets the camera sensor rotation.
+ *
+ * This is needed on some mobile platforms to get the number of degrees the camera sensor
+ * is rotated relative to the screen.
+ *
+ * @param stream The video stream related to the operation
+ * @return The camera sensor rotation in degrees (0 to 360) or -1 if it could not be retrieved
+ */
+MS2_PUBLIC int video_stream_get_camera_sensor_rotation(VideoStream *stream);
+
+/*provided for compatibility, use video_stream_set_direction() instead */
+MS2_PUBLIC int video_stream_recv_only_start(VideoStream *videostream, RtpProfile *profile, const char *addr, int port, int used_pt, int jitt_comp);
+MS2_PUBLIC int video_stream_send_only_start(VideoStream *videostream,
+				RtpProfile *profile, const char *addr, int port, int rtcp_port,
+				int used_pt, int  jitt_comp, MSWebCam *device);
+MS2_PUBLIC void video_stream_recv_only_stop(VideoStream *vs);
+MS2_PUBLIC void video_stream_send_only_stop(VideoStream *vs);
+
+/* enable ZRTP on the video stream using information from the audio stream */
+MS2_PUBLIC void video_stream_enable_zrtp(VideoStream *vstream, AudioStream *astream);
+MS2_PUBLIC void video_stream_start_zrtp(VideoStream *stream);
+
+/* enable SRTP on the video stream */
+static MS2_INLINE bool_t video_stream_enable_strp(VideoStream* stream, MSCryptoSuite suite, const char* snd_key, const char* rcv_key) {
+	return media_stream_enable_srtp(&stream->ms, suite, snd_key, rcv_key);
+}
+
+/* if enabled, the display filter will internaly rotate the video, according to the device orientation */
+MS2_PUBLIC void video_stream_enable_display_filter_auto_rotate(VideoStream* stream, bool_t enable);
+
+/* retrieve RTP statistics*/
+static MS2_INLINE void video_stream_get_local_rtp_stats(VideoStream *stream, rtp_stats_t *stats) {
+	media_stream_get_local_rtp_stats(&stream->ms, stats);
+}
+
+static MS2_INLINE int video_stream_set_dscp(VideoStream *stream, int dscp) {
+	return media_stream_set_dscp(&stream->ms, dscp);
+}
+
+/**
+ * Gets the RTP session of a video stream.
+ * @param[in] stream #MediaStream object.
+ * @return The RTP session of the video stream.
+ */
+static MS2_INLINE RtpSession * video_stream_get_rtp_session(const VideoStream *stream) {
+	return media_stream_get_rtp_session(&stream->ms);
+}
+
+/**
+ * Ask the video stream whether a decoding error should be reported (eg. to send a VFU request).
+ * @param[in] stream The VideoStream object.
+ * @param[in] ms The minimum interval in milliseconds between to decoding error report.
+ * @return TRUE if the decoding error should be reported, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t video_stream_is_decoding_error_to_be_reported(VideoStream *stream, uint32_t ms);
+
+/**
+ * Tell the video stream that a decoding error has been reported.
+ * @param[in] stream The VideoStream object.
+ */
+MS2_PUBLIC void video_stream_decoding_error_reported(VideoStream *stream);
+
+/**
+ * Tell the video stream that a decoding error has been recovered so that new decoding can be reported sooner.
+ * @param[in] stream The VideoStream object.
+ */
+MS2_PUBLIC void video_stream_decoding_error_recovered(VideoStream *stream);
+
+
+/**
+ * Force a resolution for the preview.
+ * @param[in] stream The VideoStream object.
+ * @param[in] vsize video resolution.
+**/
+MS2_PUBLIC void video_stream_set_preview_size(VideoStream *stream, MSVideoSize vsize);
+
+/**
+ * Force a resolution for the preview.
+ * @param[in] stream The VideoStream object.
+ * @param[in] fps the frame rate in frame/seconds. A value of zero means "use encoder default value".
+**/
+MS2_PUBLIC void video_stream_set_fps(VideoStream *stream, float fps);
+
+/**
+ * Link the audio stream with an existing video stream.
+ * This is necessary to enable recording of audio & video into a multimedia file.
+ */
+MS2_PUBLIC void audio_stream_link_video(AudioStream *stream, VideoStream *video);
+
+/**
+ * Unlink the audio stream from the video stream.
+ * This must be done if the video stream is about to be stopped.
+**/
+MS2_PUBLIC void audio_stream_unlink_video(AudioStream *stream, VideoStream *video);
+
+/**
+ * Set a video preset to be used for the video stream.
+ * @param[in] stream VideoStream object
+ * @param[in] preset The name of the video preset to be used.
+ */
+MS2_PUBLIC void video_stream_use_video_preset(VideoStream *stream, const char *preset);
+
+/**
+ * Returns the name of the video preset used for the video stream.
+ * @param[in] stream VideoStream object
+ */
+MS2_PUBLIC const char* video_stream_get_video_preset(VideoStream *stream);
+
+
+/**
+ * Open a player to play a video file (mkv) to remote end.
+ * The player is returned as a MSFilter so that application can make usual player controls on it using the MSPlayerInterface.
+**/
+MS2_PUBLIC MSFilter * video_stream_open_remote_play(VideoStream *stream, const char *filename);
+
+MS2_PUBLIC void video_stream_close_remote_play(VideoStream *stream);
+
+/**
+ * Open a recorder to record the video coming from remote end into a mkv file.
+ * This must be done before the stream is started.
+**/
+MS2_PUBLIC MSFilter * video_stream_open_remote_record(VideoStream *stream, const char *filename);
+
+MS2_PUBLIC void video_stream_close_remote_record(VideoStream *stream);
+
+MS2_PUBLIC void video_stream_enable_retransmission_on_nack(VideoStream *stream, bool_t enable);
+MS2_PUBLIC void video_stream_set_retransmission_on_nack_max_packet(VideoStream *stream, unsigned int max);
+
+/**
+ * Small API to display a local preview window.
+**/
+
+typedef VideoStream VideoPreview;
+
+MS2_PUBLIC VideoPreview * video_preview_new(MSFactory *factory);
+#define video_preview_set_event_callback(p,c,u) video_stream_set_event_callback(p,c,u)
+#define video_preview_set_size(p,s) video_stream_set_sent_video_size(p,s)
+#define video_preview_set_display_filter_name(p,dt) video_stream_set_display_filter_name(p,dt)
+#define video_preview_set_native_window_id(p,id) video_stream_set_native_preview_window_id(p,id)
+#define video_preview_get_native_window_id(p) video_stream_get_native_preview_window_id(p)
+#define video_preview_set_fps(p,fps) video_stream_set_fps((VideoStream*)p,fps)
+#define video_preview_set_device_rotation(p, r) video_stream_set_device_rotation(p, r)
+MS2_PUBLIC void video_preview_start(VideoPreview *stream, MSWebCam *device);
+MS2_PUBLIC void video_preview_enable_qrcode(VideoPreview *stream, bool_t enable);
+MS2_PUBLIC void video_preview_set_decode_rect(VideoPreview *stream, MSRect rect);
+MS2_PUBLIC bool_t video_preview_qrcode_enabled(VideoPreview *stream);
+MS2_PUBLIC MSVideoSize video_preview_get_current_size(VideoPreview *stream);
+MS2_PUBLIC void video_preview_stop(VideoPreview *stream);
+MS2_PUBLIC void video_preview_change_camera(VideoPreview *stream, MSWebCam *cam);
+MS2_PUBLIC void video_preview_update_video_params(VideoPreview *stream);
+
+
+/**
+ * Stops the video preview graph but keep the source filter for reuse.
+ * This is useful when transitioning from a preview-only to a duplex video.
+ * The filter needs to be passed to the #video_stream_start_with_source function,
+ * otherwise you should destroy it.
+ * @param[in] stream VideoPreview object
+ * @return The source filter to be passed to the #video_stream_start_with_source function.
+ */
+MS2_PUBLIC MSFilter* video_preview_stop_reuse_source(VideoPreview *stream);
+
+/*
+ * Returns the web cam descriptor for the mire kind of camera.
+**/
+MS2_PUBLIC MSWebCamDesc *ms_mire_webcam_desc_get(void);
+
+/**
+ * Create an RTP session for duplex communication.
+ * @param[in] local_ip The local IP to bind the RTP and RTCP sockets to.
+ * @param[in] local_rtp_port The local port to bind the RTP socket to.
+ * @param[in] local_rtcp_port The local port to bind the RTCP socket to.
+ */
+MS2_PUBLIC RtpSession * ms_create_duplex_rtp_session(const char* local_ip, int loc_rtp_port, int loc_rtcp_port, int mtu);
+
+/**
+ * Asks the audio playback filter to route to the selected device (currently only used for blackberry)
+ * @param[in] stream The AudioStream object
+ * @param[in] route The wanted audio output device (earpiece, speaker)
+ */
+MS2_PUBLIC void audio_stream_set_audio_route(AudioStream *stream, MSAudioRoute route);
+
+/**
+ * @}
+**/
+
+/**
+ * @addtogroup text_stream_api
+ * @{
+**/
+
+struct _TextStream
+{
+	MediaStream ms;
+	MSFilter *rttsource;
+	MSFilter *rttsink;
+	int pt_t140;
+	int pt_red;
+};
+
+typedef struct _TextStream TextStream;
+
+/**
+ * Creates a TextStream object listening on a RTP port.
+ * @param loc_rtp_port the local UDP port to listen for RTP packets.
+ * @param loc_rtcp_port the local UDP port to listen for RTCP packets
+ * @param ipv6 TRUE if ipv6 must be used.
+ * @param factory
+ * @return a new TextStream.
+**/
+MS2_PUBLIC TextStream *text_stream_new(MSFactory *factory, int loc_rtp_port, int loc_rtcp_port, bool_t ipv6);
+
+/**
+ * Creates a TextStream object from initialized MSMediaStreamSessions.
+ * @param sessions the MSMediaStreamSessions
+ * @param factory
+ * @return a new TextStream
+**/
+MS2_PUBLIC TextStream *text_stream_new_with_sessions(MSFactory *factory, const MSMediaStreamSessions *sessions);
+
+/**
+ * Creates a TextStream object listening on a RTP port for a dedicated address.
+ * @param loc_ip the local ip to listen for RTP packets. Can be ::, O.O.O.O or any ip4/6 addresses
+ * @param [in] loc_rtp_port the local UDP port to listen for RTP packets.
+ * @param [in] loc_rtcp_port the local UDP port to listen for RTCP packets
+ * @param factory
+ * @return a new TextStream.
+**/
+MS2_PUBLIC TextStream *text_stream_new2(MSFactory *factory, const char* ip, int loc_rtp_port, int loc_rtcp_port);
+
+/**
+ * Starts a text stream.
+ *
+ * @param[in] stream TextStream object previously created with text_stream_new().
+ * @param[in] profile RtpProfile object holding the PayloadType that can be used during the text session.
+ * @param[in] rem_rtp_addr The remote IP address where to send the text to.
+ * @param[in] rem_rtp_port The remote port where to send the text to.
+ * @param[in] rem_rtcp_addr The remote IP address for RTCP.
+ * @param[in] rem_rtcp_port The remote port for RTCP.
+ * @param[in] payload_type The payload type number used to send the text stream. A valid PayloadType must be available at this index in the profile.
+ * @param[in] factory
+ */
+MS2_PUBLIC TextStream* text_stream_start(TextStream *stream, RtpProfile *profile, const char *rem_rtp_addr, int rem_rtp_port, const char *rem_rtcp_addr, int rem_rtcp_port,
+										 int payload_type);
+
+/**
+ *  Stops the text streaming thread and free everything
+**/
+MS2_PUBLIC void text_stream_stop (TextStream * stream);
+
+/**
+ * Executes background low priority tasks related to text processing (RTP statistics analysis).
+ * It should be called periodically, for example with an interval of 100 ms or so.
+ *
+ * @param[in] stream TextStream object previously created with text_stream_new().
+ */
+MS2_PUBLIC void text_stream_iterate(TextStream *stream);
+
+/**
+ * Writes a character to stream in UTF-32 format.
+ *
+ * @param[in] stream TextStream object previously created with text_stream_new().
+ * @param[in] i the Char in UTF-32 format.
+ **/
+MS2_PUBLIC void text_stream_putchar32(TextStream *stream, uint32_t i);
+
+MS2_PUBLIC void text_stream_prepare_text(TextStream *stream);
+MS2_PUBLIC void text_stream_unprepare_text(TextStream *stream);
+
+/**
+ * @}
+**/
+
+MS2_PUBLIC void update_bitrate_limit_from_tmmbr(MediaStream *obj, int br_limit);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/ms_srtp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/ms_srtp.h"
new file mode 100755
index 0000000..94d455e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/ms_srtp.h"
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ms_srtp_h
+#define ms_srtp_h
+
+#include <ortp/rtpsession.h>
+#include "mediastreamer2/mscommon.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+/* defined in mediastream.h */
+#ifndef MS_MEDIA_STREAM_SESSIONS_DEFINED
+typedef struct _MSMediaStreamSessions MSMediaStreamSessions;
+#define MS_MEDIA_STREAM_SESSIONS_DEFINED 1
+#endif
+
+/*
+ * Crypto suite used configure encrypted stream*/
+typedef enum _MSCryptoSuite{
+        MS_CRYPTO_SUITE_INVALID=0,
+        MS_AES_128_SHA1_80,
+        MS_AES_128_SHA1_32,
+        MS_AES_128_NO_AUTH,
+        MS_NO_CIPHER_SHA1_80,
+        MS_AES_256_SHA1_80,
+        MS_AES_CM_256_SHA1_80,
+        MS_AES_256_SHA1_32
+} MSCryptoSuite;
+
+typedef struct _MSCryptoSuiteNameParams{
+        const char *name;
+        const char *params;
+}MSCryptoSuiteNameParams;
+
+MS2_PUBLIC MSCryptoSuite ms_crypto_suite_build_from_name_params(const MSCryptoSuiteNameParams *nameparams);
+MS2_PUBLIC int ms_crypto_suite_to_name_params(MSCryptoSuite cs, MSCryptoSuiteNameParams *nameparams);
+
+
+/* defined in srtp.h*/
+typedef struct _MSSrtpCtx MSSrtpCtx;
+
+typedef enum {
+	MSSRTP_RTP_STREAM,
+	MSSRTP_RTCP_STREAM,
+	MSSRTP_ALL_STREAMS
+} MSSrtpStreamType;
+/**
+ * return humanly readable string
+ * @param[in]	type
+ * @return
+ *
+ * */
+MS2_PUBLIC const char * ms_srtp_stream_type_to_string(const MSSrtpStreamType type);
+/**
+ * Check if SRTP is supported
+ * @return true if SRTP is supported
+ */
+MS2_PUBLIC bool_t ms_srtp_supported(void);
+
+/**
+ * Set encryption requirements.
+ * srtp session might be created/deleted depending on requirement parameter and already set keys
+ * @param[in/out]	sessions	The sessions associated to the current media stream
+ * @param[in]		yesno		If yes, any incoming/outgoing rtp packets are silently discarded.
+ * until keys are provided using functions #media_stream_set_srtp_recv_key_b64 or #media_stream_set_srtp_recv_key
+ * @return	0 on success, error code otherwise
+ */
+
+MS2_PUBLIC int ms_media_stream_sessions_set_encryption_mandatory(MSMediaStreamSessions *sessions, bool_t yesno);
+
+/**
+ * Get encryption requirements.
+ * @param[in/out]	sessions	The sessions associated to the current media stream
+ * @return	TRUE if only encrypted rtp packet shall be sent/received
+ */
+
+MS2_PUBLIC bool_t ms_media_stream_sessions_get_encryption_mandatory(const MSMediaStreamSessions *sessions);
+
+/**
+ * Set srtp receiver key for the given media stream.
+ * If no srtp session exists on the stream it is created, if it already exists srtp policy is created/modified for the receiver side of the stream.
+ *
+ * @param[in/out]	sessions	The sessions associated to the current media stream
+ * @param[in]		suite		The srtp crypto suite to use
+ * @param[in]		key		Srtp master key and master salt in a base 64 NULL terminated string
+ * @return	0 on success, error code otherwise
+ */
+MS2_PUBLIC int ms_media_stream_sessions_set_srtp_recv_key_b64(MSMediaStreamSessions *sessions, MSCryptoSuite suite, const char* key);
+
+/**
+ * Set srtp receiver key for the given media stream.
+ * If no srtp session exists on the stream it is created, if it already exists srtp policy is created/modified for the receiver side of the stream.
+ *
+ * @param[in/out]	sessions	The sessions associated to the current media stream
+ * @param[in]		suite		The srtp crypto suite to use
+ * @param[in]		key		Srtp master key and master salt
+ * @param[in]		key_length	key buffer length
+ * @param[in]		stream_type	Srtp suite is applied to RTP stream, RTCP stream or both
+ * @return	0 on success, error code otherwise
+ */
+MS2_PUBLIC int ms_media_stream_sessions_set_srtp_recv_key(MSMediaStreamSessions *sessions, MSCryptoSuite suite, const char* key, size_t key_length, MSSrtpStreamType stream_type);
+
+/**
+ * Set srtp sender key for the given media stream.
+ * If no srtp session exists on the stream it is created, if it already exists srtp policy is created/modified for the sender side of the stream.
+ *
+ * @param[in/out]	sessions	The sessions associated to the current media stream
+ * @param[in]		suite	The srtp crypto suite to use
+ * @param[in]		key	Srtp master key and master salt in a base 64 NULL terminated string
+ * @return	0 on success, error code otherwise
+ */
+MS2_PUBLIC int ms_media_stream_sessions_set_srtp_send_key_b64(MSMediaStreamSessions *sessions, MSCryptoSuite suite, const char* key);
+
+/**
+ * Set srtp sender key for the given media stream.
+ * If no srtp session exists on the stream it is created, if it already exists srtp policy is created/modified for the sender side of the stream.
+ *
+ * @param[in/out]	stream	The mediastream to operate on
+ * @param[in]		suite		The srtp crypto suite to use
+ * @param[in]		key		Srtp master key and master salt
+ * @param[in]		key_length	key buffer length
+ * @param[in]		stream_type	Srtp suite is applied to RTP stream, RTCP stream or both
+ * @return	0 on success, error code otherwise
+ */
+MS2_PUBLIC int ms_media_stream_sessions_set_srtp_send_key(MSMediaStreamSessions *sessions, MSCryptoSuite suite, const char* key, size_t key_length, MSSrtpStreamType stream_type);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ms_srtp_h */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msasync.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msasync.h"
new file mode 100755
index 0000000..012ee5c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msasync.h"
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msasync_h
+#define msasync_h
+
+#include "mediastreamer2/mscommon.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _MSTask;
+
+typedef void (*MSTaskFunc)(void *);
+
+typedef enum _MSTaskState{
+	MSTaskInit,
+	MSTaskQueued,
+	MSTaskRunning,
+	MSTaskDone /**<the task was executed normally*/
+}MSTaskState;
+
+struct _MSTask{
+	/*state and mutex are overkill for the moment - it's for later managing task cancellation*/
+	ms_mutex_t mutex;
+	MSTaskFunc func;
+	void *data;
+	MSTaskState state;
+};
+
+typedef struct _MSTask MSTask;
+
+struct _MSWorkerThread{
+	ms_thread_t thread;
+	ms_cond_t cond;
+	ms_mutex_t mutex;
+	bctbx_list_t *tasks;
+	bool_t running;
+	bool_t inwait;
+	bool_t finish_tasks;
+};
+
+typedef struct _MSWorkerThread MSWorkerThread;
+
+MS2_PUBLIC MSWorkerThread * ms_worker_thread_new(void);
+MS2_PUBLIC void ms_worker_thread_add_task(MSWorkerThread *obj, MSTaskFunc fn, void *data);
+MS2_PUBLIC void ms_worker_thread_destroy(MSWorkerThread *obj, bool_t finish_tasks);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msaudiomixer.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msaudiomixer.h"
new file mode 100755
index 0000000..95379f2
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msaudiomixer.h"
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef msaudiomixer_h
+#define msaudiomixer_h
+
+#include <mediastreamer2/msfilter.h>
+
+typedef struct MSAudioMixerCtl{
+	int pin;
+	union param_t { 
+		float gain; /**<gain correction */
+		int active; /**< to mute or unmute the input channel */
+		int enabled; /**< to mute/unmute the output channel*/
+	} param;
+} MSAudioMixerCtl;
+
+#define MS_AUDIO_MIXER_SET_INPUT_GAIN			MS_FILTER_METHOD(MS_AUDIO_MIXER_ID,0,MSAudioMixerCtl)
+/** Tells whether channel contributes to the mix.*/
+#define MS_AUDIO_MIXER_SET_ACTIVE			MS_FILTER_METHOD(MS_AUDIO_MIXER_ID,1,MSAudioMixerCtl)
+#define MS_AUDIO_MIXER_ENABLE_CONFERENCE_MODE		MS_FILTER_METHOD(MS_AUDIO_MIXER_ID,2,int)
+
+/**The master channel is the one that is used to synchronize the others. No flow control is done on the master channel*/
+#define MS_AUDIO_MIXER_SET_MASTER_CHANNEL		MS_FILTER_METHOD(MS_AUDIO_MIXER_ID,3,int)
+
+#define MS_AUDIO_MIXER_ENABLE_OUTPUT			MS_FILTER_METHOD(MS_AUDIO_MIXER_ID,4,MSAudioMixerCtl)
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mschanadapter.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mschanadapter.h"
new file mode 100755
index 0000000..9dc976e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mschanadapter.h"
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef mchanadapter_h
+#define mchanadapter_h
+
+#include <mediastreamer2/msfilter.h>
+
+#define MS_CHANNEL_ADAPTER_SET_OUTPUT_NCHANNELS	MS_FILTER_METHOD(MS_CHANNEL_ADAPTER_ID,0,int)
+#define MS_CHANNEL_ADAPTER_GET_OUTPUT_NCHANNELS	MS_FILTER_METHOD(MS_CHANNEL_ADAPTER_ID,1,int)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mscodecutils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mscodecutils.h"
new file mode 100755
index 0000000..2dccdd6
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mscodecutils.h"
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef mscodecutils_h
+#define mscodecutils_h
+
+#include "mediastreamer2/mscommon.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Helper object for audio decoders to determine whether PLC (packet loss concealment is needed).
+**/
+typedef struct _MSConcealerContext MSConcealerContext;
+
+/**
+ * Creates a new concealer object.
+ * @param max_plc_count the number of consecutive milliseconds of PLC allowed.
+**/
+MS2_PUBLIC MSConcealerContext* ms_concealer_context_new(uint32_t max_plc_count);
+/**
+ * Destroys a concealer object.
+**/
+MS2_PUBLIC void ms_concealer_context_destroy(MSConcealerContext* context);
+
+/**
+ * Returns 1 when PLC is needed, 0 otherwise.
+ * @param obj the concealer object
+ * @param current_time the current time in milliseconds, as pointed by f->ticker->time .
+**/
+MS2_PUBLIC unsigned int ms_concealer_context_is_concealement_required(MSConcealerContext* obj, uint64_t current_time);
+
+/**
+ * Call this function whenever you decoded a packet, for true or in PLC mode, to inform the concealer
+ * of how the audio stream is going.
+ * @param obj the concealer object
+ * @param current_time the current time in milliseconds, as pointed by f->ticker->time.
+ * @param time_increment the number of milliseconds of audio decoded.
+ * @param got_packet set to TRUE if a real frame was decoded, FALSE if it was a PLC frame.
+ * @return if a PLC period terminates, returns the duration of this PLC period in milliseconds, 0 otherwise.
+**/
+MS2_PUBLIC uint32_t ms_concealer_inc_sample_time(MSConcealerContext* obj, uint64_t current_time, uint32_t time_increment, bool_t got_packet);
+
+
+MS2_PUBLIC unsigned long ms_concealer_context_get_total_number_of_plc(MSConcealerContext* obj);
+
+
+/**
+ * Helper object for audio decoders to determine whether PLC (packet loss concealment is needed), based on timestamp information.
+**/
+typedef struct _MSConcealerTsContext MSConcealerTsContext;
+
+/**
+ * Creates a new concealer object.
+ * @param max_plc_count maximum duration of PLC allowed, expressed in timestamp units.
+**/
+MS2_PUBLIC MSConcealerTsContext* ms_concealer_ts_context_new(unsigned int max_plc_ts);
+/**
+ * Destroys a concealer object.
+**/
+MS2_PUBLIC void ms_concealer_ts_context_destroy(MSConcealerTsContext* context);
+
+/**
+ * Returns 1 when PLC is needed, 0 otherwise.
+ * @param obj the concealer object
+ * @param current_ts the current time converted in timestamp units, usually (f->ticker->time*clock_rate)/1000 .
+**/
+MS2_PUBLIC unsigned int ms_concealer_ts_context_is_concealement_required(MSConcealerTsContext* obj,uint64_t current_ts);
+
+/**
+ * Call this function whenever you decoded a packet, for true or in PLC mode, to inform the concealer
+ * of how the audio stream is going.
+ * @param obj the concealer object
+ * @param current_ts the current time converted in timestamp units, usually (f->ticker->time*clock_rate)/1000
+ * @param ts_increment the duration of audio decoded expressed in timestamp units
+ * @param got_packet set to TRUE if a real frame was decoded, FALSE if it was a PLC frame.
+ * @return if a PLC period terminates, returns the duration of this PLC period in timestamp units, 0 otherwise.
+**/
+MS2_PUBLIC uint32_t ms_concealer_ts_context_inc_sample_ts(MSConcealerTsContext* obj, uint64_t current_ts, uint32_t ts_increment, bool_t got_packet);
+
+
+MS2_PUBLIC unsigned long ms_concealer_ts_context_get_total_number_of_plc(MSConcealerTsContext* obj);
+
+
+/*FEC API*/
+typedef struct _MSRtpPayloadPickerContext MSRtpPayloadPickerContext;
+typedef mblk_t* (*RtpPayloadPicker)(MSRtpPayloadPickerContext* context,unsigned int sequence_number);
+struct _MSRtpPayloadPickerContext {
+	void* filter_graph_manager; /*I.E stream*/
+	RtpPayloadPicker picker;
+};
+
+struct _MSOfferAnswerContext;
+
+#ifndef MS_OFFER_ANSWER_CONTEXT_DEFINED
+#define MS_OFFER_ANSWER_CONTEXT_DEFINED
+typedef struct _MSOfferAnswerContext MSOfferAnswerContext;
+#endif
+
+/* SDP offer answer payload matching API*/
+
+/**
+ * The MSPayloadMatcherFunc prototype takes:
+ * - a list of local payload types
+ * - a remote payload type (offered or answered) by remote to be matched agains payload types of the local payload type list.
+ * - the full list of remote (offered or answered) payload types, which is sometimes necessary to do the matching in ambiguous situations.
+ * - is_reading, a boolean indicating whether we are doing the match processing while reading a SDP response, or (if FALSE) to prepare a response to be sent.
+ * The expected return value is a newly allocated PayloadType similar to the local payload type that was matched.
+ * Due to specific per codec offer/answer logic, the fmtp of the payload type might be changed compared to the original local payload type.
+ * If there is no match, NULL must be returned.
+**/
+typedef PayloadType * (*MSPayloadMatcherFunc)(MSOfferAnswerContext *context, const MSList *local_payloads, const PayloadType *remote_payload, const MSList *remote_payloads, bool_t is_reading);
+
+/**
+ * The MSOfferAnswerContext is only there to provide a context during the SDP offer/answer handshake.
+ * It could be used in the future to provide extra information, for the moment the context is almost useless*/
+struct _MSOfferAnswerContext{
+	MSPayloadMatcherFunc match_payload;
+	void (*destroy)(MSOfferAnswerContext *ctx);
+	void *context_data;
+};
+
+
+/**
+ * Executes an offer/answer processing for a given codec.
+ * @param context the context
+ * @param local_payloads the local payload type supported
+ * @param remote_payload a remote payload type (offered or answered) by remote to be matched agains payload types of the local payload type list.
+ * @param remote_payloads the full list of remote (offered or answered) payload types, which is sometimes necessary to do the matching in ambiguous situations.
+ * @param is_reading, a boolean indicating whether we are doing the match processing while reading a SDP response, or (if FALSE) to prepare a response to be sent.
+ * The expected return value is a newly allocated PayloadType similar to the local payload type that was matched.
+ * Due to specific per codec offer/answer logic, the fmtp of the payload type might be changed compared to the original local payload type.
+ * If there is no match, NULL must be returned.
+**/
+MS2_PUBLIC PayloadType * ms_offer_answer_context_match_payload(MSOfferAnswerContext *context, const MSList *local_payloads, const PayloadType *remote_payload, const MSList *remote_payloads, bool_t is_reading); 
+MS2_PUBLIC void ms_offer_answer_context_destroy(MSOfferAnswerContext *ctx);
+
+/**
+ * A convenience function to instanciate an offer answer context giving only the payload matching function pointer.
+**/
+MS2_PUBLIC MSOfferAnswerContext *ms_offer_answer_create_simple_context(MSPayloadMatcherFunc func);
+/**
+ * The struct to declare offer-answer provider, that act as factories per mime type to instanciate MSOfferAnswerContext object able to take in charge
+ * the offer answer model for a particular codec
+**/
+struct _MSOfferAnswerProvider{
+	const char *mime_type;
+	MSOfferAnswerContext *(*create_context)(void);
+};
+
+/**
+ * A convenience structure and API to intellengently limit the number of key frame request of an encoder.
+ **/
+typedef struct _MSIFrameRequestsLimiterCtx {
+	uint64_t last_sent_iframe_time;
+	int min_iframe_interval;
+	bool_t iframe_required;
+} MSIFrameRequestsLimiterCtx;
+
+MS2_PUBLIC void ms_iframe_requests_limiter_init(MSIFrameRequestsLimiterCtx *obj, int min_iframe_interval_ms);
+
+MS2_PUBLIC void ms_iframe_requests_limiter_request_iframe(MSIFrameRequestsLimiterCtx *obj);
+
+MS2_PUBLIC bool_t ms_iframe_requests_limiter_iframe_requested(const MSIFrameRequestsLimiterCtx *obj, uint64_t curtime_ms);
+
+MS2_PUBLIC void ms_iframe_requests_limiter_notify_iframe_sent(MSIFrameRequestsLimiterCtx *obj, uint64_t curtime_ms);
+
+/**
+ * The goal of this small object is to tell when to send I frames at startup:
+ * at 2 and 4 seconds.
+ */
+
+
+typedef struct MSVideoStarter {
+	uint64_t next_time;
+	int i_frame_count;
+	bool_t active;
+} MSVideoStarter;
+
+MS2_PUBLIC void ms_video_starter_init(MSVideoStarter *vs);
+MS2_PUBLIC void ms_video_starter_first_frame(MSVideoStarter *vs, uint64_t curtime);
+MS2_PUBLIC bool_t ms_video_starter_need_i_frame(MSVideoStarter *vs, uint64_t curtime);
+MS2_PUBLIC void ms_video_starter_deactivate(MSVideoStarter *vs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mscommon.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mscommon.h"
new file mode 100755
index 0000000..d2c15a3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mscommon.h"
@@ -0,0 +1,592 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef mscommon_h
+#define mscommon_h
+
+#include <bctoolbox/port.h>
+#include <bctoolbox/list.h>
+#include <bctoolbox/logging.h>
+#include <ortp/port.h>
+#include <ortp/str_utils.h>
+#include <ortp/payloadtype.h>
+#include <time.h>
+#if defined(__APPLE__)
+#include "TargetConditionals.h"
+#endif
+
+#if defined(__arm__) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM)
+#define MS_HAS_ARM 1
+#endif
+#if defined(__ARM_NEON__) || defined(__ARM_NEON)
+#define MS_HAS_ARM_NEON 1
+#endif
+#if MS_HAS_ARM_NEON && !(defined(__arm64__) || defined(__aarch64__))
+#define MS_HAS_ARM_NEON_32 1
+#endif
+
+#ifndef MS2_DEPRECATED
+#if defined(_MSC_VER)
+#define MS2_DEPRECATED __declspec(deprecated)
+#else
+#define MS2_DEPRECATED __attribute__ ((deprecated))
+#endif
+#endif
+#define MS_UNUSED(x) ((void)(x))
+
+#define ms_malloc	ortp_malloc
+#define ms_malloc0	ortp_malloc0
+#define ms_realloc	ortp_realloc
+#define ms_new		ortp_new
+#define ms_new0		ortp_new0
+#define ms_free		ortp_free
+#define ms_strdup	ortp_strdup
+#define ms_strndup	ortp_strndup
+#define ms_strdup_printf	ortp_strdup_printf
+#define ms_strcat_printf	ortp_strcat_printf
+
+#define ms_mutex_t		ortp_mutex_t
+#define ms_mutex_init		ortp_mutex_init
+#define ms_mutex_destroy	ortp_mutex_destroy
+#define ms_mutex_lock		ortp_mutex_lock
+#define ms_mutex_unlock		ortp_mutex_unlock
+
+#define ms_cond_t		ortp_cond_t
+#define ms_cond_init		ortp_cond_init
+#define ms_cond_wait		ortp_cond_wait
+#define ms_cond_signal		ortp_cond_signal
+#define ms_cond_broadcast	ortp_cond_broadcast
+#define ms_cond_destroy		ortp_cond_destroy
+
+#define MS_DEFAULT_MAX_PAYLOAD_SIZE 1440
+
+#define MS2_INLINE ORTP_INLINE
+
+#ifdef _WIN32
+#if defined(__MINGW32__) || !defined(WINAPI_FAMILY_PARTITION) || !defined(WINAPI_PARTITION_DESKTOP)
+#define MS2_WINDOWS_DESKTOP 1
+#elif defined(WINAPI_FAMILY_PARTITION)
+#if defined(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+#define MS2_WINDOWS_DESKTOP 1
+#elif defined(WINAPI_PARTITION_PHONE_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
+#define MS2_WINDOWS_PHONE 1
+#elif defined(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+#define MS2_WINDOWS_DESKTOP 1
+#endif
+#endif
+#endif
+
+#if defined(_MSC_VER)
+#ifdef MS2_STATIC
+#define MS2_PUBLIC
+#define MS2_VAR_PUBLIC extern
+#else
+#ifdef MS2_EXPORTS
+#define MS2_PUBLIC	__declspec(dllexport)
+#define MS2_VAR_PUBLIC extern __declspec(dllexport)
+#else
+#define MS2_PUBLIC	__declspec(dllimport)
+#define MS2_VAR_PUBLIC extern __declspec(dllimport)
+#endif
+#endif
+#else
+#define MS2_PUBLIC
+#define MS2_VAR_PUBLIC extern
+#endif
+
+#if defined(_WIN32_WCE)
+time_t ms_time (time_t *t);
+#else
+#define ms_time time
+#endif
+
+#ifdef DEBUG
+static MS2_INLINE void ms_debug(const char *fmt,...)
+{
+  va_list args;
+  va_start (args, fmt);
+  bctbx_logv(BCTBX_LOG_DOMAIN, BCTBX_LOG_DEBUG, fmt, args);
+  va_end (args);
+}
+#else
+#define ms_debug(fmt, ...)
+#endif
+
+#define ms_message	bctbx_message
+#define ms_warning	bctbx_warning
+#define ms_error	bctbx_error
+#define ms_fatal	bctbx_fatal
+
+#define ms_return_val_if_fail(_expr_,_ret_)\
+	if (!(_expr_)) { ms_fatal("assert "#_expr_ "failed"); return (_ret_);}
+
+#define ms_return_if_fail(_expr_) \
+	if (!(_expr_)){ ms_fatal("assert "#_expr_ "failed"); return ;}
+
+#define ms_thread_t		ortp_thread_t
+#define ms_thread_create 	ortp_thread_create
+#define ms_thread_join		ortp_thread_join
+#define ms_thread_self		ortp_thread_self
+
+typedef ortpTimeSpec MSTimeSpec;
+
+#define ms_get_cur_time ortp_get_cur_time
+#define ms_get_cur_time_ms ortp_get_cur_time_ms
+
+typedef bctbx_compare_func MSCompareFunc;
+typedef void (*MSIterateFunc)(void *a);
+typedef void (*MSIterate2Func)(void *a, void *b);
+typedef void (*MSIterate3Func)(void *a, void *b, void *c);
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+/*for stun*/
+typedef struct { unsigned char octet[12]; } UInt96;
+typedef struct { unsigned char octet[16]; } UInt128;
+
+MS2_PUBLIC void ms_thread_exit(void* ret_val);
+
+
+#define MSList bctbx_list_t
+
+/**
+ * @addtogroup ms_list
+ * @{
+**/
+
+/** Inserts a new element containing data to the end of a given list
+ * @param list list where data should be added. If NULL, a new list will be created.
+ * @param data data to insert into the list
+ * @return first element of the list
+ * @deprecated Use bctbx_list_append() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_append(MSList *list, void * data);
+
+/** Inserts given element to the end of a given list
+ * @param list list where data should be added. If NULL, a new list will be created.
+ * @param new_elem element to append
+ * @return first element of the list
+ * @deprecated Use bctbx_list_append_link() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_append_link(MSList *list, MSList *new_elem);
+
+/** Inserts a new element containing data to the start of a given list
+ * @param list list where data should be added. If NULL, a new list will be created.
+ * @param data data to insert into the list
+ * @return first element of the list - the one which was just created.
+ * @deprecated Use bctbx_list_prepend() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_prepend(MSList *list, void * data);
+
+/** Frees all elements of a given list
+ * Note that data contained in each element will not be freed. If you need to clean
+ * them, consider using @ms_list_free_with_data
+ * @param list object to free.
+ * @return NULL
+ * @deprecated Use bctbx_list_free() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_free(MSList *list);
+
+/** Frees all elements of a given list after having called freefunc on each element
+ * @param list object to free.
+ * @param freefunc function to invoke on each element data before destroying the element
+ * @return NULL
+ * @deprecated Use bctbx_list_free_with_data() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_free_with_data(MSList *list, void (*freefunc)(void*));
+
+/** Concatenates second list to the end of first list
+ * @param first First list
+ * @param second Second list to append at the end of first list.
+ * @return first element of the merged list
+ * @deprecated Use bctbx_list_concat() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_concat(MSList *first, MSList *second);
+
+/** Finds and remove the first element containing the given data. Nothing is done if element is not found.
+ * @param list List in which data must be removed
+ * @param data Data to remove
+ * @return first element of the modified list
+ * @deprecated Use bctbx_list_remove() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_remove(MSList *list, void *data);
+
+/** Finds and remove any elements according to the given predicate function
+ * @param list List in which data must be removed
+ * @param compare_func Function to invoke on each element. If it returns TRUE, the given element will be deleted.
+ * @param user_data User data to pass to compare_func function
+ * @return first element of the modified list
+ * @deprecated Use bctbx_list_remove_custom() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList * ms_list_remove_custom(MSList *list, MSCompareFunc compare_func, const void *user_data);
+
+/** Returns size of a given list
+ * @param list List to measure
+ * @return Size of list
+ * @deprecated Use bctbx_list_size() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED int ms_list_size(const MSList *list);
+
+/** Invoke function on each element of the list
+ * @param list List object
+ * @param iterate_func Function to invoke on each element.
+ * @deprecated Use bctbx_list_for_each() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED void ms_list_for_each(const MSList *list, MSIterateFunc iterate_func);
+
+/** Invoke function on each element of the list
+ * @param list List object
+ * @param iterate_func Function to invoke on each element.
+ * @param user_data User data to pass to iterate_func function.
+ * @deprecated Use bctbx_list_for_each2() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED void ms_list_for_each2(const MSList *list, MSIterate2Func iterate_func, void *user_data);
+	
+MS2_PUBLIC MS2_DEPRECATED void ms_list_for_each3(const MSList *list, MSIterate3Func iterate_func, void *user_data, void *factory);
+
+/** Finds and remove given element in list.
+ * @param list List in which element must be removed
+ * @param element element to remove
+ * @return first element of the modified list
+ * @deprecated Use bctbx_list_remove_link() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_remove_link(MSList *list, MSList *elem);
+
+/** Finds first element containing data in the given list.
+ * @param list List in which element must be found
+ * @param data data to find
+ * @return element containing data, or NULL if not found
+ * @deprecated Use bctbx_list_find() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_find(MSList *list, void *data);
+
+/** Finds first element according to the given predicate function
+ * @param list List in which element must be found
+ * @param compare_func Function to invoke on each element. If it returns TRUE, the given element will be returned.
+ * @param user_data User data to pass to compare_func function
+ * @return Element matching the predicate, or NULL if none is found.
+ * @deprecated Use bctbx_list_find_custom() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_find_custom(MSList *list, MSCompareFunc compare_func, const void *user_data);
+
+/** Returns the nth element data of the list
+ * @param list List object
+ * @param index data index which must be returned.
+ * @return Element at the given index. NULL if index is invalid (negative or greater or equal to ms_list_size).
+ * @deprecated Use bctbx_list_nth_data() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED void * ms_list_nth_data(const MSList *list, int index);
+
+/** Returns the index of the given element
+ * @param list List object
+ * @param elem Element to search for.
+ * @return Index of the given element. -1 if not found.
+ * @deprecated Use bctbx_list_position() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED int ms_list_position(const MSList *list, MSList *elem);
+
+/** Returns the index of the first element containing data
+ * @param list List object
+ * @param data Data to search for.
+ * @return Index of the element containing data. -1 if not found.
+ * @deprecated Use bctbx_list_index() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED int ms_list_index(const MSList *list, void *data);
+
+/** Inserts a new element containing data at the place given by compare_func
+ * @param list list where data should be added. If NULL, a new list will be created.
+ * @param data data to insert into the list
+ * @param compare_func function determining where should the new element be placed
+ * @return first element of the list.
+ * @deprecated Use bctbx_list_insert_sorted() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_insert_sorted(MSList *list, void *data, MSCompareFunc compare_func);
+
+/** Inserts a new element containing data before the given element
+ * @param list list where data should be added. If NULL, a new list will be created.
+ * @param before element parent to the one we will insert.
+ * @param data data to insert into the list
+ * @return first element of the modified list.
+ * @deprecated Use bctbx_list_insert() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_insert(MSList *list, MSList *before, void *data);
+
+/** Copies a list in another one, duplicating elements but not data
+ * @param list list to copy
+ * @return Newly created list
+ * @deprecated Use bctbx_list_copy() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_copy(const MSList *list);
+
+/** Copies a list in another one, duplicating elements according to the given function
+ * @param list list to copy
+ * @param copyfunc function to invoke on each element which will return the new list data value
+ * @return Newly created list
+ * @deprecated Use bctbx_list_copy_with_data() instead
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_list_copy_with_data(const MSList *list, void *(*copyfunc)(void *));
+
+/**
+ * @deprecated @deprecated Use bctbx_list_next() instead
+ */
+MS2_PUBLIC MS2_DEPRECATED MSList* ms_list_next(const MSList *list);
+
+/** @} */
+
+MS2_PUBLIC char * ms_tags_list_as_string(const MSList *list);
+MS2_PUBLIC bool_t ms_tags_list_contains_tag(const MSList *list, const char *tag);
+
+#undef MIN
+#define MIN(a,b)	((a)>(b) ? (b) : (a))
+#undef MAX
+#define MAX(a,b)	((a)>(b) ? (a) : (b))
+
+/**
+ * @file mscommon.h
+ * @brief mediastreamer2 mscommon.h include file
+ *
+ * This file provide the API needed to initialize
+ * and reset the mediastreamer2 library.
+ *
+ */
+
+/**
+ * @addtogroup mediastreamer2_init
+ * @{
+ */
+
+
+/**
+ * Helper macro for backward compatibility.
+ * Use ms_base_init() and ms_voip_init() instead.
+ */
+#define ms_init()	ms_base_init(), ms_voip_init(), ms_plugins_init()
+
+/**
+ * Helper macro for backward compatibility.
+ * Use ms_base_exit() and ms_voip_exit() instead.
+ */
+#define ms_exit()	ms_voip_exit(), ms_plugins_exit(), ms_base_exit()
+
+/**
+ * Initialize the mediastreamer2 base library.
+ *
+ * This must be called once before calling any other API.
+ * @deprecated use ms_factory_new()
+ */
+MS2_PUBLIC MS2_DEPRECATED void ms_base_init(void);
+
+/**
+ * Initialize the mediastreamer2 VoIP library.
+ *
+ * This must be called one before calling any other API.
+ * @deprecated use ms_factory_new_with_voip().
+ */
+MS2_PUBLIC MS2_DEPRECATED void ms_voip_init(void);
+
+/**
+ * Load the plugins from the default plugin directory.
+ *
+ * This is just a wrapper around ms_load_plugins().
+ * This must be called after ms_base_init() and after ms_voip_init().
+ * @deprecated use ms_factory_init_plugins(), or ms_factory_new_with_voip() that does it automatically.
+ */
+MS2_PUBLIC MS2_DEPRECATED void ms_plugins_init(void);
+
+/**
+ * Set the directory from where the plugins are to be loaded when calling ms_plugins_init().
+ * @param[in] path The path to the plugins directory.
+ * @deprecated use ms_factory_set_plugins_dir().
+ */
+MS2_PUBLIC MS2_DEPRECATED void ms_set_plugins_dir(const char *path);
+
+/**
+ * Load plugins from a specific directory.
+ * This method basically loads all libraries in the specified directory and attempts to call a C function called
+ * \<libraryname\>_init. For example if a library 'libdummy.so' or 'libdummy.dll' is found, then the loader tries to locate
+ * a C function called 'libdummy_init()' and calls it if it exists.
+ * ms_load_plugins() can be used to load non-mediastreamer2 plugins as it does not expect mediastreamer2 specific entry points.
+ *
+ * @param directory   A directory where plugins library are available.
+ *
+ * @return >0 if successfull, 0 if not plugins loaded, -1 otherwise.
+ * @deprecated use ms_factory_load_plugins().
+ */
+MS2_PUBLIC MS2_DEPRECATED int ms_load_plugins(const char *directory);
+
+/**
+ * Release resource allocated in the mediastreamer2 base library.
+ *
+ * This must be called once before closing program.
+ * @deprecated use ms_factory_destroy().
+ */
+MS2_PUBLIC MS2_DEPRECATED void  ms_base_exit(void);
+
+/**
+ * Release resource allocated in the mediastreamer2 VoIP library.
+ *
+ * This must be called once before closing program.
+ * @deprecated use ms_factory_destroy().
+ */
+MS2_PUBLIC MS2_DEPRECATED void ms_voip_exit(void);
+
+/**
+ * Unload the plugins loaded by ms_plugins_init().
+ * @deprecated use ms_factory_destroy().
+ */
+MS2_PUBLIC MS2_DEPRECATED void ms_plugins_exit(void);
+
+struct _MSSndCardDesc;
+
+MS2_PUBLIC void ms_sleep(int seconds);
+
+MS2_PUBLIC void ms_usleep(uint64_t usec);
+
+/**
+ * The max payload size allowed.
+ * Filters that generate data that can be sent through RTP should make packets
+ * whose size is below ms_get_payload_max_size().
+ * The default value is 1440 computed as the standard internet MTU minus IPv6 header,
+ * UDP header and RTP header. As IPV4 header is smaller than IPv6 header, this
+ * value works for both.
+ * @deprecated use ms_factory_get_payload_max_size().
+**/
+MS2_PUBLIC MS2_DEPRECATED int ms_get_payload_max_size(void);
+
+/**
+ * Set the maximum payload size allowed.
+ * @deprecated use ms_factory_set_payload_max_size().
+**/
+MS2_PUBLIC MS2_DEPRECATED void ms_set_payload_max_size(int size);
+
+/**
+ * Returns the network Max Transmission Unit to reach destination_host.
+ * This will attempt to send one or more big packets to destination_host, to a random port.
+ * Those packets are filled with zeroes.
+**/
+MS2_PUBLIC int ms_discover_mtu(const char *destination_host);
+
+/**
+ * Set mediastreamer default mtu, used to compute the default RTP max payload size.
+ * This function will call ms_set_payload_max_size(mtu-[ipv6 header size]).
+ * @deprecated use ms_factory_set_mtu()
+**/
+MS2_PUBLIC MS2_DEPRECATED void ms_set_mtu(int mtu);
+
+/**
+ * Get mediastreamer default mtu, used to compute the default RTP max payload size.
+ * @deprecated use ms_factory_get_mtu().
+**/
+MS2_PUBLIC MS2_DEPRECATED int ms_get_mtu(void);
+
+/**
+ * Declare how many cpu (cores) are available on the platform
+ * @deprecated use ms_factory_set_cpu_count().
+ */
+MS2_PUBLIC MS2_DEPRECATED void ms_set_cpu_count(unsigned int c);
+
+/**
+ * @deprecated use ms_factory_get_cpu_count().
+**/
+MS2_PUBLIC MS2_DEPRECATED unsigned int ms_get_cpu_count(void);
+
+/**
+ * Adds a new entry in the SoundDeviceDescription table
+ */
+MS2_PUBLIC void ms_sound_device_description_add(const char *manufacturer, const char *model, const char *platform, unsigned int flags, int delay, int recommended_rate);
+
+/**
+ * @return TRUE if address is ipv6
+ */
+MS2_PUBLIC bool_t ms_is_ipv6(const char *address);
+
+/**
+ * @return TRUE if address is multicast
+ */
+bool_t ms_is_multicast_addr(const struct sockaddr *address);
+/**
+ * @return TRUE if address is multicast
+ */
+MS2_PUBLIC bool_t ms_is_multicast(const char *address);
+
+/**
+ * Utility function to load a file into memory.
+ * @param file a FILE handle
+ * @param nbytes (optional) number of bytes read
+**/
+MS2_PUBLIC char *ms_load_file_content(FILE *file, size_t *nbytes);
+
+/**
+ * Utility function to load a file into memory.
+ * @param path a FILE handle
+ * @param nbytes (optional) number of bytes read
+**/
+MS2_PUBLIC char *ms_load_path_content(const char *path, size_t *nbytes);
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef MS2_INTERNAL
+#  ifdef HAVE_CONFIG_H
+#  include "mediastreamer-config.h" /*necessary to know if ENABLE_NLS is there*/
+#  endif
+
+#ifdef _WIN32
+#include <malloc.h> //for alloca
+#ifdef _MSC_VER
+#define alloca _alloca
+#endif
+#endif
+
+#  if defined(ENABLE_NLS)
+
+#ifdef _MSC_VER
+// prevent libintl.h from re-defining fprintf and vfprintf
+#ifndef fprintf
+#define fprintf fprintf
+#endif
+#ifndef vfprintf
+#define vfprintf vfprintf
+#endif
+#define _GL_STDIO_H
+#endif
+
+#    include <libintl.h>
+#    define _(String) dgettext (GETTEXT_PACKAGE, String)
+#  else
+#    define _(String) (String)
+#  endif // ENABLE_NLS
+#define N_(String) (String)
+
+/*
+ * Used by audio encoders in case no default standardized maxptime defined.
+ */
+#ifndef MS_DEFAULT_MAX_PTIME
+	#define MS_DEFAULT_MAX_PTIME 140
+#endif
+
+#endif // MS2_INTERNAL
+
+#ifdef __ANDROID__
+#include "mediastreamer2/msjava.h"
+#endif
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msconference.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msconference.h"
new file mode 100755
index 0000000..6d4e9f3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msconference.h"
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Convenient API to create and manage audio conferences.
+ */
+
+#ifndef msconference_h
+#define msconference_h
+
+#include "mediastreamer2/mediastream.h"
+
+/**
+ * @addtogroup mediastreamer2_audio_conference
+ * @{
+ */
+
+/**
+ * Structure that holds audio conference parameters
+**/
+struct _MSAudioConferenceParams{
+	int samplerate; /**< Conference audio sampling rate in Hz: 8000, 16000 ...*/
+};
+
+/**
+ * Typedef to structure that holds conference parameters
+**/
+typedef struct _MSAudioConferenceParams MSAudioConferenceParams;
+
+/**
+ * The MSAudioConference is the object representing an audio conference.
+ *
+ * First, the conference has to be created with ms_audio_conference_new(), with parameters supplied.
+ * Then, participants to the conference can be added with ms_audio_conference_add_member().
+ * The MSAudioConference takes in charge the mixing and dispatching of the audio to the participants.
+ * If participants (MSAudioEndpoint) are using sampling rate different from the conference, then sample rate converters are automatically added
+ * and configured.
+ * Participants can be removed from the conference with ms_audio_conference_remove_member().
+ * The conference processing is performed in a new thread run by a MSTicker object, which is owned by the conference.
+ * When all participants are removed, the MSAudioConference object can then be safely destroyed with ms_audio_conference_destroy().
+**/
+typedef struct _MSAudioConference MSAudioConference;
+
+
+/**
+ * The MSAudioEndpoint represents a participant in the conference.
+ * It can be constructed from an existing AudioStream object with
+ * ms_audio_endpoint_get_from_stream().
+**/
+typedef struct _MSAudioEndpoint MSAudioEndpoint;
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Creates a conference.
+ * @param params a MSAudioConferenceParams structure, containing conference parameters.
+ * @param factory a MSFactory structure, containing filters parameters
+ * @return a MSAudioConference object.
+**/
+MS2_PUBLIC MSAudioConference * ms_audio_conference_new(const MSAudioConferenceParams *params, MSFactory *factory);
+
+/**
+ * Gets conference's current parameters.
+ * @param obj the conference.
+ * @return a read-only pointer to the conference parameters.
+**/
+MS2_PUBLIC const MSAudioConferenceParams *ms_audio_conference_get_params(MSAudioConference *obj);
+
+/**
+ * Adds a participant to the conference.
+ * @param obj the conference
+ * @param ep the participant, represented as a MSAudioEndpoint object
+**/
+MS2_PUBLIC void ms_audio_conference_add_member(MSAudioConference *obj, MSAudioEndpoint *ep);
+
+/**
+ * Removes a participant from the conference.
+ * @param obj the conference
+ * @param ep the participant, represented as a MSAudioEndpoint object
+**/
+MS2_PUBLIC void ms_audio_conference_remove_member(MSAudioConference *obj, MSAudioEndpoint *ep);
+
+/**
+ * Mutes or unmutes a participant.
+ * 
+ * @param obj the conference
+ * @param ep the participant, represented as a MSAudioEndpoint object
+ * @param muted true to mute the participant, false to unmute.
+ *
+ * By default all participants are unmuted.
+**/
+MS2_PUBLIC void ms_audio_conference_mute_member(MSAudioConference *obj, MSAudioEndpoint *ep, bool_t muted);
+
+/**
+ * Returns the size (ie the number of participants) of a conference.
+ * @param obj the conference
+**/
+MS2_PUBLIC int ms_audio_conference_get_size(MSAudioConference *obj);
+
+/**
+ * Destroys a conference.
+ * @param obj the conference
+ * All participants must have been removed before destroying the conference.
+**/
+MS2_PUBLIC void ms_audio_conference_destroy(MSAudioConference *obj);
+
+/**
+ * Creates an MSAudioEndpoint from an existing AudioStream.
+ *
+ * In order to create graphs for audio processing of each participant, the AudioStream object is used, because
+ * this object already handles all the processing for volume control, encoding, decoding, etc...
+ *
+ * The construction of the participants depends whether it is a remote participant, that is somebody in the network
+ * sending and receiving audio through RTP, or a local participant, that is somebody using the local soundcard to capture
+ * and play audio.
+ *
+ * To create a remote participant, first create and start an AudioStream for the participant with audio_stream_new() and
+ * audio_stream_start_with_files(), given NULL arguments as input and output files.
+ * This participant does not interact with soundcards, this is why we suggest to use audio_stream_start_full() to avoid 
+ * holding any reference to the sound system.
+ * Then, create a MSAudioEndpoint representing this participant by calling ms_audio_endpoint_get_from_stream() with
+ * is_remote=TRUE.
+ *
+ * To create a local participant, first create and start an AudioStream with audio_stream_new() and audio_stream_start_full(), 
+ * with real soundcard arguments.
+ * Arguments controlling RTP should be filled with placeholders value and will not be used for conferencing.
+ * Then, create a MSAudioEndpoint representing this local participant by calling ms_audio_endpoint_get_from_stream() 
+ * with the audiostream and is_remote=FALSE.<br>
+ * For example:<br>
+ * <PRE>
+ * AudioStream *st=audio_stream_new(65000,65001,FALSE);
+ * audio_stream_start_full(st, conf->local_dummy_profile,
+ *				"127.0.0.1",
+ *				65000,
+ *				"127.0.0.1",
+ *				65001,
+ *				0,
+ *				40,
+ *				NULL,
+ *				NULL,
+ *				playcard,
+ *				captcard,
+ *				needs_echocancellation,
+ *				);
+ * MSAudioEndpoint *local_endpoint=ms_audio_endpoint_get_from_stream(st,FALSE);
+ * </PRE>
+**/
+MS2_PUBLIC MSAudioEndpoint * ms_audio_endpoint_get_from_stream(AudioStream *st, bool_t is_remote);
+
+/**
+ * Destroys a MSAudioEndpoint that was created from an AudioStream with ms_audio_endpoint_get_from_stream().
+ * The AudioStream can then be destroyed if needed.
+**/
+MS2_PUBLIC void ms_audio_endpoint_release_from_stream(MSAudioEndpoint *obj);
+
+/**
+ * Creates an audio endpoint (or virtual participant) to record the conference into a wav file.
+ * @param factory The factory used by the linphone core.
+**/
+MS2_PUBLIC MSAudioEndpoint * ms_audio_endpoint_new_recorder(MSFactory* factory);
+
+/**
+ * Start audio recording.
+ * The endpoint must have been created by ms_audio_endpoint_new_recorder().
+ * @param ep the endpoint
+ * @param path path for the wav file where to record samples.
+ * @return 0 if successful, -1 if the path is invalid.
+**/
+MS2_PUBLIC int ms_audio_recorder_endpoint_start(MSAudioEndpoint *ep, const char *path);
+
+/**
+ * Stop audio recording.
+ * The endpoint must have been created by ms_audio_endpoint_new_recorder().
+ * @param ep the endpoint
+ * @return 0 if successful, -1 if the record wasn't started.
+**/
+MS2_PUBLIC int ms_audio_recorder_endpoint_stop(MSAudioEndpoint *ep);
+
+/**
+ * Destroy an audio endpoint.
+ * @note Endpoints created by ms_audio_endpoint_get_from_stream() must be released by ms_audio_endpoint_release_from_stream().
+**/
+MS2_PUBLIC void ms_audio_endpoint_destroy(MSAudioEndpoint *ep);
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @}
+ */
+
+
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msequalizer.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msequalizer.h"
new file mode 100755
index 0000000..d8cba6b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msequalizer.h"
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msequalizer_h
+#define msequalizer_h
+
+#include <mediastreamer2/msfilter.h>
+
+typedef struct _MSEqualizerGain{
+	float frequency; ///< In hz
+	float gain; ///< between 0-1.2
+	float width; ///< frequency band width around mid frequency for which the gain is applied, in Hz. Use 0 for the lowest frequency resolution.
+}MSEqualizerGain;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MS2_PUBLIC MSList *ms_parse_equalizer_string(const char *str);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define MS_EQUALIZER_SET_GAIN		MS_FILTER_METHOD(MS_EQUALIZER_ID,0,MSEqualizerGain)
+#define MS_EQUALIZER_GET_GAIN		MS_FILTER_METHOD(MS_EQUALIZER_ID,1,MSEqualizerGain)
+#define MS_EQUALIZER_SET_ACTIVE		MS_FILTER_METHOD(MS_EQUALIZER_ID,2,int)
+/**dump the spectral response into a table of float. The table must be sized according to the value returned by
+ * MS_EQUALIZER_GET_NUM_FREQUENCIES 
+**/
+#define MS_EQUALIZER_DUMP_STATE		MS_FILTER_METHOD(MS_EQUALIZER_ID,3,float)
+
+/**returns the number of frequencies*/
+#define MS_EQUALIZER_GET_NUM_FREQUENCIES	MS_FILTER_METHOD(MS_EQUALIZER_ID,4,int)
+
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mseventqueue.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mseventqueue.h"
new file mode 100755
index 0000000..a8e3699
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mseventqueue.h"
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef mseventqueue_h
+#define mseventqueue_h
+
+#include <mediastreamer2/mscommon.h>
+#include <mediastreamer2/msfactory.h>
+
+typedef struct _MSEventQueue MSEventQueue;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Creates an event queue to receive notifications from MSFilters.
+ *
+ * The queue can be installed to be global with ms_set_global_event_queue().
+ * The application can then schedule the callbacks for the events
+ * received by the queue by calling ms_event_queue_pump()
+**/ 
+MS2_PUBLIC MSEventQueue *ms_event_queue_new(void);
+
+/**
+ * Install a global event queue.
+ *
+ * All filters currently scheduled by MSTickers will send events (notifications)
+ * to the event queue.
+ *
+**/
+MS2_PUBLIC MS2_DEPRECATED void ms_set_global_event_queue(MSEventQueue *q);
+
+/**
+ * Run callbacks associated to the events received.
+ * The user can register a notify callback per filter using
+ * ms_filter_set_notify_callback() in order to be informed 
+ * of various events generated by a MSFilter.
+**/
+MS2_PUBLIC void ms_event_queue_pump(MSEventQueue *q);
+
+/**
+ * Discard all pending events.
+**/
+MS2_PUBLIC void ms_event_queue_skip(MSEventQueue *q);
+
+/**
+ * Destroys an event queue.
+**/
+//MS2_PUBLIC MS2_DEPRECATED void ms_event_queue_destroy(MSEventQueue *q);
+MS2_PUBLIC void ms_event_queue_destroy(MSEventQueue *q);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msextdisplay.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msextdisplay.h"
new file mode 100755
index 0000000..a149dbd
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msextdisplay.h"
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef msextdisplay_h
+#define msextdisplay_h
+
+#include <mediastreamer2/msfilter.h>
+#include <mediastreamer2/msvideo.h>
+
+typedef struct _MSExtDisplayOutput{
+	MSPicture remote_view;
+	MSPicture local_view;
+}MSExtDisplayOutput;
+
+/* a synchronous event generated by the filter when a new picture is to be drawn */
+#define MS_EXT_DISPLAY_ON_DRAW MS_FILTER_EVENT(MS_EXT_DISPLAY_ID,0,MSExtDisplayOutput)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfactory.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfactory.h"
new file mode 100755
index 0000000..702f0a0
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfactory.h"
@@ -0,0 +1,464 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msfactory_h
+#define msfactory_h
+
+
+#include "mediastreamer2/msfilter.h"
+#include "mediastreamer2/devices.h"
+
+/*do not use these fields directly*/
+struct _MSFactory{
+	MSList *desc_list;
+	MSList *stats_list;
+	MSList *offer_answer_provider_list;
+#ifdef _WIN32
+	MSList *ms_plugins_loaded_list;
+#endif
+	MSList *formats;
+	MSList *platform_tags;
+	char *plugins_dir;
+	struct _MSVideoPresetsManager *video_presets_manager;
+	int cpu_count;
+	struct _MSEventQueue *evq;
+	int max_payload_size;
+	int mtu;
+	struct _MSSndCardManager* sndcardmanager;
+	struct _MSWebCamManager* wbcmanager;
+	void (*voip_uninit_func)(struct _MSFactory*);
+	bool_t statistics_enabled;
+	bool_t voip_initd;
+	MSDevicesInfo *devices_info;
+	char *image_resources_dir;
+	char *echo_canceller_filtername;
+	int expected_video_bandwidth;
+};
+
+typedef struct _MSFactory MSFactory;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef MS2_DEPRECATED
+#if defined(_MSC_VER)
+#define MS2_DEPRECATED __declspec(deprecated)
+#else
+#define MS2_DEPRECATED __attribute__ ((deprecated))
+#endif
+#endif
+
+/**
+ * Create a mediastreamer2 factory. This is the root object that will create everything else from mediastreamer2.
+**/
+MS2_PUBLIC MSFactory *ms_factory_new(void);
+
+/**
+ * Create a mediastreamer2 factory and initialize all voip related filter, card and webcam managers.
+**/
+MS2_PUBLIC MSFactory* ms_factory_new_with_voip(void);
+
+/**
+ * Create a mediastreamer2 factory, initialize all voip related filters, cards and webcam managers and load the plugins from the specified directory.
+ * @param[in] plugins_dir The path where to find the mediastreamer2 plugins to be loaded
+ * @param[in] images_dir The path where to find the images
+ */
+MS2_PUBLIC MSFactory *ms_factory_new_with_voip_and_directories(const char *plugins_dir, const char *images_dir);
+
+/**
+ * Create the fallback factory (for compatibility with applications not using MSFactory to create ms2 object)
+**/
+MS2_DEPRECATED MS2_PUBLIC MSFactory *ms_factory_create_fallback(void);
+
+/**
+ * Used by the legacy functions before MSFactory was added.
+ * Do not use in an application.
+**/
+MS2_DEPRECATED MS2_PUBLIC MSFactory *ms_factory_get_fallback(void);
+
+/**
+ * Destroy the factory.
+ * This should be done after destroying all objects created by the factory.
+**/
+MS2_PUBLIC void ms_factory_destroy(MSFactory *factory);
+
+/*
+ * Obtain the soundcard manager.
+**/
+MS2_PUBLIC struct _MSSndCardManager* ms_factory_get_snd_card_manager(MSFactory *f);
+
+/**
+ * Obtain the webcam manager.
+*/
+MS2_PUBLIC struct _MSWebCamManager* ms_factory_get_web_cam_manager(MSFactory* f);
+
+
+/**
+ * Register a filter descriptor (MSFilterDesc) into the factory.
+**/
+MS2_PUBLIC void ms_factory_register_filter(MSFactory *factory, MSFilterDesc *desc);
+
+/**
+ * Retrieve capture filter that supports encoding to codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilterDesc if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilterDesc * ms_factory_get_encoding_capturer(MSFactory *factory, const char *mime);
+
+/**
+ * Retrieve render filter that supports decoding to codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilterDesc if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilterDesc * ms_factory_get_decoding_renderer(MSFactory *factory, const char *mime);
+
+/**
+ * Retrieve encoders according to codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilterDesc if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilterDesc * ms_factory_get_encoder(MSFactory *factory, const char *mime);
+
+/**
+ * Retrieve decoders according to codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilterDesc if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilterDesc * ms_factory_get_decoder(MSFactory *factory, const char *mime);
+
+/**
+ * Lookup a mediastreamer2 filter using its name.
+ * If found, the descriptor (MSFilterDesc) is returned.
+ * This descriptor can be used to instanciate the filter using ms_filter_new_from_desc()
+ * This function can be useful to query the presence of a filter loaded as a plugin, for example.
+ *
+ * @param filter_name The filter name.
+**/
+MS2_PUBLIC MSFilterDesc *ms_factory_lookup_filter_by_name(const MSFactory *factory, const char *filter_name);
+
+/**
+ * Lookup a mediastreamer2 filter using its id.
+ * If found, the descriptor (MSFilterDesc) is returned.
+ * This descriptor can be used to instanciate the filter using ms_filter_new_from_desc()
+ * This function can be useful to query the presence of a filter loaded as a plugin, for example.
+ *
+ * @param id The filter id.
+**/
+MS2_PUBLIC MSFilterDesc* ms_factory_lookup_filter_by_id( MSFactory* factory, MSFilterId id);
+
+/**
+ * Returns a list of filter descriptions implementing a given interface.
+ * The list itself must be freed by the caller of this function, but not the MSFilterDesc pointed by the list elements.
+ * @param id a filter interface id
+ * @return a newly allocated MSList of #MSFilterDesc.
+**/
+MS2_PUBLIC MSList *ms_factory_lookup_filter_by_interface(MSFactory *factory, MSFilterInterfaceId id);
+
+/**
+ * Returns a list of all filter descriptions.
+ * @return a newly allocated MSList of #MSFilterDesc.
+ **/
+MS2_PUBLIC const MSList *ms_factory_get_filter_decs(const MSFactory *factory);
+
+/**
+ * Create encoder filter according to codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilter * ms_factory_create_encoder(MSFactory *factory, const char *mime);
+
+/**
+ * Create decoder filter according to codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilter * ms_factory_create_decoder(MSFactory *factory, const char *mime);
+
+/**
+ * Check if a encode or decode filter exists for a codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return TRUE if successfull, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t ms_factory_codec_supported(MSFactory *factory, const char *mime);
+
+/**
+ * Check if an encoder filter exists for a codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return TRUE if successfull, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t ms_factory_has_encoder(MSFactory *factory, const char *mime);
+
+/**
+ * Check if a decoder filter exists for a codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return TRUE if successfull, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t ms_factory_has_decoder(MSFactory *factory, const char *mime);
+
+
+/**
+ * Create decoder filter according to a filter's MSFilterId.
+ *
+ * @param id     A MSFilterId identifier for the filter.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilter *ms_factory_create_filter(MSFactory *factory, MSFilterId id);
+
+/**
+ * Create decoder filter according to a filter's name.
+ *
+ * @param name   A name for the filter.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilter *ms_factory_create_filter_from_name(MSFactory *factory, const char *name);
+
+/**
+ * Create decoder filter according to a filter's description.
+ *
+ * The primary use is to create your own filter's in your
+ * application and avoid registration inside mediastreamer2.
+ *
+ * @param desc   A MSFilterDesc for the filter.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSFilter *ms_factory_create_filter_from_desc(MSFactory *factory, MSFilterDesc *desc);
+
+/**
+ * Enable filter statistics measurement at run time.
+**/
+MS2_PUBLIC void ms_factory_enable_statistics(MSFactory* obj, bool_t enabled);
+
+/**
+ * Obtain a list of MSFilterStats.
+**/
+MS2_PUBLIC const MSList * ms_factory_get_statistics(MSFactory* obj);
+
+/**
+ * Reset filter's statistics.
+**/
+MS2_PUBLIC void ms_factory_reset_statistics(MSFactory *obj);
+
+/**
+ * Output statistics to logs.
+**/
+MS2_PUBLIC void ms_factory_log_statistics(MSFactory *obj);
+
+/**
+ * Get number of available cpus for processing.
+ * The factory initializes this value to the number of logicial processors
+ * available on the machine where it runs.
+**/
+MS2_PUBLIC unsigned int ms_factory_get_cpu_count(MSFactory *obj);
+
+/**
+ * Set the number of available cpus for processing.
+**/
+MS2_PUBLIC void ms_factory_set_cpu_count(MSFactory *obj, unsigned int c);
+
+MS2_PUBLIC void ms_factory_add_platform_tag(MSFactory *obj, const char *tag);
+
+MS2_PUBLIC MSList * ms_factory_get_platform_tags(MSFactory *obj);
+
+MS2_PUBLIC char * ms_factory_get_platform_tags_as_string(MSFactory *obj);
+
+MS2_PUBLIC struct _MSVideoPresetsManager * ms_factory_get_video_presets_manager(MSFactory *factory);
+
+MS2_PUBLIC void ms_factory_init_plugins(MSFactory *obj);
+
+/**
+ * Set directory where plugins are to be loaded.
+**/
+MS2_PUBLIC void ms_factory_set_plugins_dir(MSFactory *obj, const char *path);
+
+/**
+ * Allows to load plugins from a list that contains their names instead of listing files from a directory.
+ **/ 
+MS2_PUBLIC int ms_factory_load_plugins_from_list(MSFactory *factory, const bctbx_list_t *plugins_list, const char *optionnal_plugins_path);
+
+/**
+ * Loads files in parameter directory matching template libms<name>.PLUGIN_EXT.
+ **/
+MS2_PUBLIC int ms_factory_load_plugins(MSFactory *factory, const char *dir);
+
+MS2_PUBLIC void ms_factory_uninit_plugins(MSFactory *obj);
+
+/**
+ * Init VOIP features (registration of codecs, sound card and webcam managers).
+**/
+MS2_PUBLIC void ms_factory_init_voip(MSFactory *obj);
+
+MS2_PUBLIC void ms_factory_uninit_voip(MSFactory *obj);
+
+/**
+ * Creates an event queue.
+ * Only one can exist so if it has already been created the same one will be returned.
+ * @param[in] obj MSFactory object.
+ * @return The created event queue.
+ */
+MS2_PUBLIC struct _MSEventQueue * ms_factory_create_event_queue(MSFactory *obj);
+	
+MS2_PUBLIC void ms_factory_destroy_event_queue(MSFactory *obj);
+	
+	/**
+ * Gets the event queue associated with the factory.
+ * Can be NULL if no event queue has been created.
+ * @param[in] obj MSFactory object.
+ * @return The event queue associated with the factory.
+ */
+MS2_PUBLIC struct _MSEventQueue * ms_factory_get_event_queue(MSFactory *obj);
+
+MS2_PUBLIC void ms_factory_set_event_queue(MSFactory *obj,struct _MSEventQueue *q);
+
+MS2_PUBLIC int ms_factory_get_payload_max_size(const MSFactory *factory);
+
+MS2_PUBLIC void ms_factory_set_payload_max_size(MSFactory *obj, int size);
+	
+MS2_PUBLIC void ms_factory_set_mtu(MSFactory *obj, int mtu);
+
+MS2_PUBLIC int ms_factory_get_mtu(const MSFactory *obj);
+
+/**
+ * Set the name of the echo canceller filter to use.
+ * @param[in] obj MSFactory object
+ * @param[in] filtername The name of the echo canceller filter to use
+ */
+MS2_PUBLIC void ms_factory_set_echo_canceller_filter_name(MSFactory *obj, const char *filtername);
+
+/**
+ * Get the name of the echo canceller filter being used.
+ * @param[in] obj MSFactory object
+ * @return The name of the echo canceller filter being used
+ */
+MS2_PUBLIC const char * ms_factory_get_echo_canceller_filter_name(const MSFactory *obj);
+
+MS2_PUBLIC const struct _MSFmtDescriptor * ms_factory_get_audio_format(MSFactory *obj, const char *mime, int rate, int channels, const char *fmtp);
+
+MS2_PUBLIC const struct _MSFmtDescriptor * ms_factory_get_video_format(MSFactory *obj, const char *mime, MSVideoSize size, float fps, const char *fmtp);
+
+MS2_PUBLIC const MSFmtDescriptor *ms_factory_get_format(MSFactory *obj, const MSFmtDescriptor *ref);
+
+/**
+ * Specifies if a filter is enabled or not. Only enabled filter are return by functions like ms_filter_get_encoder
+ * @param factory
+ * @param name   A name for the filter.
+ * @param enable, true/false
+ * @return 0 in case of success
+ *
+ */
+MS2_PUBLIC int ms_factory_enable_filter_from_name(MSFactory *factory, const char *name, bool_t enable);
+
+/**
+ * Specifies if a filter is enabled or not. Only enabled filter are return by functions like ms_filter_get_encoder
+ *
+ * @param factory
+ * @param name   A name for the filter.
+ * @return true/false if enabled
+ *
+ */
+MS2_PUBLIC bool_t ms_factory_filter_from_name_enabled(const MSFactory *factory, const char *name);
+
+
+#ifndef MS_OFFER_ANSWER_CONTEXT_DEFINED
+#define MS_OFFER_ANSWER_CONTEXT_DEFINED
+typedef struct _MSOfferAnswerContext MSOfferAnswerContext;
+#endif
+typedef struct _MSOfferAnswerProvider MSOfferAnswerProvider;
+
+/**
+ * Registers an offer-answer provider. An offer answer provider is a kind of factory that creates
+ * context objects able to execute the particular offer/answer logic for a given codec.
+ * Indeed, several codecs have complex parameter handling specified in their RFC, and hence cannot be
+ * treated in a generic way by the global SDP offer answer logic.
+ * Mediastreamer2 plugins can then register with this method their offer/answer logic together with the encoder
+ * and decoder filters, so that it can be used by the signaling layer of the application.
+ * @param factory 
+ * @param offer_answer_prov the offer answer provider descriptor.
+**/
+MS2_PUBLIC void ms_factory_register_offer_answer_provider(MSFactory *f, MSOfferAnswerProvider *offer_answer_prov);
+
+/**
+ * Retrieve an offer answer provider previously registered, giving the codec name.
+ * @param f the factory
+ * @param mime_type the codec mime type.
+ * @return an MSOfferAnswerProvider or NULL if none was registered for this codec.
+**/
+MS2_PUBLIC MSOfferAnswerProvider * ms_factory_get_offer_answer_provider(MSFactory *f, const char *mime_type);
+
+/**
+ * Directly creates an offer-answer context giving the codec mime-type.
+ * @param f the factory
+ * @param the mime-type of the codec.
+ * @return an MSOfferAnswerContext or NULL if none was registered for this codec.
+**/
+MS2_PUBLIC MSOfferAnswerContext * ms_factory_create_offer_answer_context(MSFactory *f, const char *mime_type);
+
+MS2_PUBLIC MSDevicesInfo* ms_factory_get_devices_info(MSFactory *f);
+
+/**
+ * Get the path where the image resources (mainly the nowebcam image) are located.
+ * @param[in] f MSFactory object
+ * @return The path where the image resources are located
+ */
+MS2_PUBLIC const char * ms_factory_get_image_resources_dir(const MSFactory *f);
+
+/**
+ * Set the path where the image resources are located
+ * @param[in] f MSFactory object
+ * @param[in] path The path where the image resources are located
+ */
+MS2_PUBLIC void ms_factory_set_image_resources_dir(MSFactory *f, const char *path);
+
+MS2_PUBLIC void ms_factory_set_expected_bandwidth(MSFactory *f, int bitrate);
+
+MS2_PUBLIC int ms_factory_get_expected_bandwidth(MSFactory *f);
+
+/**
+ * Get the name of the default video renderer for the current platform.
+ * @param[in] f MSFactory object
+ * @return The name of the video filter choosen as default renderer
+ */
+MS2_PUBLIC const char *ms_factory_get_default_video_renderer(MSFactory *f);
+
+#ifdef __cplusplus
+}
+#endif
+	
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfileplayer.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfileplayer.h"
new file mode 100755
index 0000000..1d1f923
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfileplayer.h"
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef msfileplayer_h
+#define msfileplayer_h
+
+#include <mediastreamer2/msfilter.h>
+
+
+/*methods*/
+#define MS_FILE_PLAYER_OPEN	MS_FILTER_METHOD(MS_FILE_PLAYER_ID,0,const char*)
+#define MS_FILE_PLAYER_START	MS_FILTER_METHOD_NO_ARG(MS_FILE_PLAYER_ID,1)
+#define MS_FILE_PLAYER_STOP	MS_FILTER_METHOD_NO_ARG(MS_FILE_PLAYER_ID,2)
+#define MS_FILE_PLAYER_CLOSE	MS_FILTER_METHOD_NO_ARG(MS_FILE_PLAYER_ID,3)
+/* set loop mode: 
+	-1: no looping, 
+	0: loop at end of file, 
+	x>0, loop after x miliseconds after eof
+*/
+#define MS_FILE_PLAYER_LOOP	MS_FILTER_METHOD(MS_FILE_PLAYER_ID,4,int)
+#define MS_FILE_PLAYER_DONE	MS_FILTER_METHOD(MS_FILE_PLAYER_ID,5,int)
+#define MS_FILE_PLAYER_BIG_BUFFER	MS_FILTER_METHOD(MS_FILE_PLAYER_ID,6,int)
+
+/*events*/
+#define MS_FILE_PLAYER_EOF	MS_FILTER_EVENT_NO_ARG(MS_FILE_PLAYER_ID,0)
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfilerec.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfilerec.h"
new file mode 100755
index 0000000..70e0a64
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfilerec.h"
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef msfilerec_h
+#define msfilerec_h
+
+#include <mediastreamer2/msfilter.h>
+
+extern MSFilterDesc ms_file_rec_desc;
+
+#define MS_FILE_REC_OPEN	MS_FILTER_METHOD(MS_FILE_REC_ID,0,const char)
+#define MS_FILE_REC_START	MS_FILTER_METHOD_NO_ARG(MS_FILE_REC_ID,1)
+#define MS_FILE_REC_STOP	MS_FILTER_METHOD_NO_ARG(MS_FILE_REC_ID,2)
+#define MS_FILE_REC_CLOSE	MS_FILTER_METHOD_NO_ARG(MS_FILE_REC_ID,3)
+
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfilter.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfilter.h"
new file mode 100755
index 0000000..ac93d40
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msfilter.h"
@@ -0,0 +1,756 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msfilter_h
+#define msfilter_h
+
+#include "mediastreamer2/mscommon.h"
+#include "mediastreamer2/msqueue.h"
+#include "mediastreamer2/allfilters.h"
+#include "mediastreamer2/formats.h"
+#include "mediastreamer2/box-plot.h"
+
+/**
+ * @file msfilter.h
+ * @brief mediastreamer2 msfilter.h include file
+ *
+ * This file provide the API needed to create, link,
+ * unlink, find and destroy filter.
+ *
+ * It also provides definitions if you wish to implement
+ * your own filters.
+ *
+ */
+
+/**
+ * @addtogroup mediastreamer2_filter
+ * @{
+ */
+
+/**
+ * Structure for filter's methods (init, preprocess, process, postprocess, uninit).
+ * @var MSFilterFunc
+ */
+typedef void (*MSFilterFunc)(struct _MSFilter *f);
+
+/**
+ * Structure for filter's methods used to set filter's options.
+ * @var MSFilterMethodFunc
+ */
+typedef int (*MSFilterMethodFunc)(struct _MSFilter *f, void *arg);
+
+/**
+ * Structure for filter's methods used as a callback to notify events.
+ * @var MSFilterNotifyFunc
+ */
+typedef void (*MSFilterNotifyFunc)(void *userdata, struct _MSFilter *f, unsigned int id, void *arg);
+
+struct _MSFilterMethod{
+	unsigned int id;
+	MSFilterMethodFunc method;
+};
+
+
+/**
+ * Interface IDs, used to generate method names (see MS_FILTER_METHOD macro).
+ * The purpose of these interfaces is to allow different filter implementations to share the same methods, by implementing the method definitions for these interfaces.
+ * For example every video encoder implementation would need a method to request the generation of a key frame. Instead of having each implementation defining its own method to do this,
+ * each implementation can just implement the MS_VIDEO_ENCODER_REQ_VFU method of the MSFilterVideoEncoderInterface.
+**/
+enum _MSFilterInterfaceId{
+	MSFilterInterfaceBegin=16384,
+	MSFilterPlayerInterface, /**<Player interface, used to control playing of files.*/
+	MSFilterRecorderInterface,/**<Recorder interface, used to control recording of stream into files.*/
+	MSFilterVideoDisplayInterface,/**<Video display interface, used to control the rendering of raw pictures onscreen.*/
+	MSFilterEchoCancellerInterface,/**Echo canceller interface, used to control echo canceller implementations.*/
+	MSFilterVideoDecoderInterface,/**<Video decoder interface*/
+	MSFilterVideoCaptureInterface,/**<Video capture interface*/
+	MSFilterAudioDecoderInterface,/**<Audio Decoder interface*/
+	MSFilterVideoEncoderInterface,/**<Video encoder interface*/
+	MSFilterAudioCaptureInterface,/**<Interface for audio capture filters*/
+	MSFilterAudioPlaybackInterface,/**Interface for audio playback filters.*/
+	MSFilterAudioEncoderInterface,/**<Video encoder interface*/
+	MSFilterVADInterface,/**<Voice activity detection interface*/
+	MSFilterVoidInterface,/**<Void source/sink interface*/
+};
+
+/**
+ * Interface IDs, used to generate method names (see MS_FILTER_METHOD macro).
+ *
+**/
+typedef enum _MSFilterInterfaceId MSFilterInterfaceId;
+
+/**
+ * Structure for holding filter's methods to set filter's options.
+ * @var MSFilterMethod
+ */
+typedef struct _MSFilterMethod MSFilterMethod;
+/**
+ * Filter's category
+ *
+ */
+enum _MSFilterCategory{
+	/**others*/
+	MS_FILTER_OTHER,
+	/**used by encoders*/
+	MS_FILTER_ENCODER,
+	/**used by decoders*/
+	MS_FILTER_DECODER,
+	/**used by capture filters that perform encoding*/
+	MS_FILTER_ENCODING_CAPTURER,
+	/**used by filters that perform decoding and rendering */
+	MS_FILTER_DECODER_RENDERER
+};
+
+/**
+ * Structure to describe filter's category.
+ * <PRE>
+ *     MS_FILTER_OTHER
+ *     MS_FILTER_ENCODER
+ *     MS_FILTER_DECODER
+ *     MS_FILTER_ENCODING_CAPTURER
+ *     MS_FILTER_DECODING_RENDERER
+ * </PRE>
+ * @var MSFilterCategory
+ */
+typedef enum _MSFilterCategory MSFilterCategory;
+
+/**
+ * Filter's flags controlling special behaviours.
+**/
+enum _MSFilterFlags{
+	MS_FILTER_IS_PUMP = 1, /**< The filter must be called in process function every tick.*/
+	/*...*/
+	/*private flags: don't use it in filters.*/
+	MS_FILTER_IS_ENABLED = 1<<31 /*<Flag to specify if a filter is enabled or not. Only enabled filters are returned by function ms_filter_get_encoder */
+};
+
+/**
+ * Filter's flags controlling special behaviours.
+**/
+typedef enum _MSFilterFlags MSFilterFlags;
+
+
+struct _MSFilterStats{
+	const char *name; /*<filter name*/
+	MSUBoxPlot bp_elapsed; /* box plot for elapsed time in filter process in nanoseconds */
+};
+
+typedef struct _MSFilterStats MSFilterStats;
+
+struct _MSFilterDesc{
+	MSFilterId id;	/**< the id declared in allfilters.h */
+	const char *name; /**< the filter name*/
+	const char *text; /**< short text describing the filter's function*/
+	MSFilterCategory category; /**< filter's category*/
+	const char *enc_fmt; /**< sub-mime of the format, must be set if category is MS_FILTER_ENCODER or MS_FILTER_DECODER */
+	int ninputs; /**< number of inputs */
+	int noutputs; /**< number of outputs */
+	MSFilterFunc init; /**< Filter's init function*/
+	MSFilterFunc preprocess; /**< Filter's preprocess function, called one time before starting to process*/
+	MSFilterFunc process; /**< Filter's process function, called every tick by the MSTicker to do the filter's job*/
+	MSFilterFunc postprocess; /**< Filter's postprocess function, called once after processing (the filter is no longer called in process() after)*/
+	MSFilterFunc uninit; /**< Filter's uninit function, used to deallocate internal structures*/
+	MSFilterMethod *methods; /**<Filter's method table*/
+	unsigned int flags; /**<Filter's special flags, from the MSFilterFlags enum.*/
+};
+
+/**
+ * Structure for filter's description.
+ * @var MSFilterDesc
+ */
+typedef struct _MSFilterDesc MSFilterDesc;
+
+struct _MSFilter{
+	MSFilterDesc *desc; /**<Back pointer to filter's descriptor.*/
+	/*protected attributes, do not move or suppress any of them otherwise plugins will be broken */
+	ms_mutex_t lock;
+	MSQueue **inputs; /**<Table of input queues.*/
+	MSQueue **outputs;/**<Table of output queues */
+	struct _MSFactory *factory;/**<the factory that created this filter*/
+	void *padding; /**Unused - to be reused later when new protected fields have to added*/
+	void *data; /**< Pointer used by the filter for internal state and computations.*/
+	struct _MSTicker *ticker; /**<Pointer to the ticker object. It is not NULL when being called process()*/
+	/*private attributes, they can be moved and changed at any time*/
+	MSList *notify_callbacks;
+	uint32_t last_tick;
+	MSFilterStats *stats;
+	int postponed_task; /*number of postponed tasks*/
+	bool_t seen;
+};
+
+
+/**
+ * Structure of filter's object.
+ * @var MSFilter
+ */
+typedef struct _MSFilter MSFilter;
+
+struct _MSConnectionPoint{
+	MSFilter *filter; /**<Pointer to filter*/
+	int pin; /**<Pin index on the filter*/
+};
+
+/**
+ * Structure that represents a connection point of a MSFilter
+ * @var MSConnectionPoint
+ */
+typedef struct _MSConnectionPoint MSConnectionPoint;
+
+struct _MSConnectionHelper{
+	MSConnectionPoint last;
+};
+
+/**
+ * Structure that holds data when using the ms_connection_helper_* functions.
+ * @var MSConnectionHelper
+**/
+typedef struct _MSConnectionHelper MSConnectionHelper;
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Register a filter description. (plugins use only!)
+ *
+ * When you build your own plugin, this method will
+ * add the encoder or decoder to the internal list
+ * of supported codec. Then, this plugin can be used
+ * transparently from the application.
+ *
+ * ms_filter_get_encoder, ms_filter_get_decoder,
+ * ms_filter_create_encoder, ms_filter_create_decoder
+ * and ms_filter_codec_supported
+ * can then be used as if the codec was internally.
+ * supported.
+ *
+ * @param desc    a filter description.
+ * @deprecated use ms_factory_register_filter().
+ */
+MS2_PUBLIC MS2_DEPRECATED void ms_filter_register(MSFilterDesc *desc);
+
+
+
+/**
+ * Retrieve capture filter that supports encoding to codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilterDesc if successfull, NULL otherwise.
+ * @deprecated use ms_factory_get_encoding_capturer().
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilterDesc * ms_filter_get_encoding_capturer(const char *mime);
+
+/**
+ * Retrieve render filter that supports decoding to codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @returns a MSFilterDesc if successfull, NULL otherwise.
+ * @deprecated use ms_factory_get_decoding_renderer()
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilterDesc * ms_filter_get_decoding_renderer(const char *mime);
+
+/**
+ * Retrieve encoders according to codec name.
+ *
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilterDesc if successfull, NULL otherwise.
+ * @deprecated use ms_factory_get_encoder().
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilterDesc * ms_filter_get_encoder(const char *mime);
+
+/**
+ * Retrieve decoders according to codec name.
+ *
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilterDesc if successfull, NULL otherwise.
+ * @deprecated use ms_factory_get_decoder().
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilterDesc * ms_filter_get_decoder(const char *mime);
+
+/**
+ * Lookup a mediastreamer2 filter using its name.
+ * If found, the descriptor (MSFilterDesc) is returned.
+ * This descriptor can be used to instanciate the filter using ms_filter_new_from_desc()
+ * This function can be useful to query the presence of a filter loaded as a plugin, for example.
+ *
+ * @param filter_name The filter name.
+ * @return a MSFilterDesc or NULL if no match.
+ * @deprecated use ms_factory_lookup_filter_by_name().
+**/
+MS2_PUBLIC MS2_DEPRECATED MSFilterDesc *ms_filter_lookup_by_name(const char *filter_name);
+
+/**
+ * Returns a list of filter descriptions implementing a given interface.
+ * The list itself must be freed by the caller of this function, but not the MSFilterDesc pointed by the list elements.
+ * @param id a filter interface id
+ * @return a newly allocated MSList of #MSFilterDesc.
+ * @deprecated use ms_factory_lookup_filter_by_interface().
+**/
+MS2_PUBLIC MS2_DEPRECATED MSList *ms_filter_lookup_by_interface(MSFilterInterfaceId id);
+
+/**
+ * Create encoder filter according to codec name.
+
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ * @deprecated use ms_factory_create_encoder().
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilter * ms_filter_create_encoder(const char *mime);
+
+/**
+ * Create decoder filter according to codec name.
+ *
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ * @deprecated use ms_factory_create_decoder().
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilter * ms_filter_create_decoder(const char *mime);
+
+/**
+ * Check if both an encoder and a decoder filter exists for a codec name.
+ *
+ * @param mime    A string indicating the codec.
+ *
+ * @return TRUE if successfull, FALSE otherwise.
+ * @deprecated use ms_factory_codec_supported().
+ */
+MS2_PUBLIC MS2_DEPRECATED bool_t ms_filter_codec_supported(const char *mime);
+
+/**
+ * Create decoder filter according to a filter's MSFilterId.
+ *
+ * @param id     A MSFilterId identifier for the filter.
+ *
+ * @returns a MSFilter if successfull, NULL otherwise.
+ * @deprecated use ms_factory_create_filter().
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilter *ms_filter_new(MSFilterId id);
+
+/**
+ * Create decoder filter according to a filter's name.
+ *
+ * @param name   A name for the filter.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ * @deprecated use ms_factory_create_filter_from_name().
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilter *ms_filter_new_from_name(const char *name);
+
+/**
+ * Create decoder filter according to a filter's description.
+ *
+ * The primary use is to create your own filter's in your
+ * application and avoid registration inside mediastreamer2.
+ *
+ * @param desc   A MSFilterDesc for the filter.
+ *
+ * @return a MSFilter if successfull, NULL otherwise.
+ * @deprecated use ms_factory_create_filter_from_desc()
+ */
+MS2_PUBLIC MS2_DEPRECATED MSFilter *ms_filter_new_from_desc(MSFilterDesc *desc);
+
+/**
+ * Link one OUTPUT pin from a filter to an INPUT pin of another filter.
+ *
+ * All data coming from the OUTPUT pin of one filter will be distributed
+ * to the INPUT pin of the second filter.
+ *
+ * @param f1   A MSFilter object containing the OUTPUT pin
+ * @param pin1 An index of an OUTPUT pin.
+ * @param f2   A MSFilter object containing the INPUT pin
+ * @param pin2 An index of an INPUT pin.
+ *
+ * Returns: 0 if sucessful, -1 otherwise.
+ */
+MS2_PUBLIC int ms_filter_link(MSFilter *f1, int pin1, MSFilter *f2, int pin2);
+
+/**
+ * Unlink one OUTPUT pin from a filter to an INPUT pin of another filter.
+ *
+ * @param f1   A MSFilter object containing the OUTPUT pin
+ * @param pin1 An index of an OUTPUT pin.
+ * @param f2   A MSFilter object containing the INPUT pin
+ * @param pin2 An index of an INPUT pin.
+ *
+ * Returns: 0 if sucessful, -1 otherwise.
+ */
+MS2_PUBLIC int ms_filter_unlink(MSFilter *f1, int pin1, MSFilter *f2, int pin2);
+
+/**
+ * Call a filter's method to set or get options.
+ *
+ * @param f    A MSFilter object.
+ * @param id   A private filter ID for the option.
+ * @param arg  A private user data for the filter.
+ *
+ * Returns: 0 if successfull, -1 otherwise.
+ */
+MS2_PUBLIC int ms_filter_call_method(MSFilter *f, unsigned int id, void *arg);
+
+/**
+ * Call a filter's method to set options.
+ *
+ * @param f    A MSFilter object.
+ * @param id   A method ID.
+ *
+ * Returns: 0 if successfull, -1 otherwise.
+ */
+MS2_PUBLIC int ms_filter_call_method_noarg(MSFilter *f, unsigned int id);
+
+
+/**
+ * Returns whether the filter implements a given method
+ *
+ * @param f    A MSFilter object.
+ * @param id   A method ID.
+ *
+ * Returns: TRUE if method is implemented, FALSE otherwise.
+ */
+MS2_PUBLIC bool_t ms_filter_has_method(MSFilter *f, unsigned int id);
+
+/**
+ * Returns whether a filter implements a given interface.
+ * @param f a MSFilter object
+ * @param id an interface id.
+ *
+ * Returns TRUE if interface is implemented, FALSE, otherwise.
+**/
+MS2_PUBLIC bool_t ms_filter_implements_interface(MSFilter *f, MSFilterInterfaceId id);
+
+/**
+ * Returns whether a filter implements a given interface, based on the filter's descriptor.
+ * @param f a MSFilter object
+ * @param id an interface id.
+ *
+ * Returns TRUE if interface is implemented, FALSE, otherwise.
+**/
+MS2_PUBLIC bool_t ms_filter_desc_implements_interface(MSFilterDesc *desc, MSFilterInterfaceId id);
+
+
+/**
+ * Set a callback on filter's to be informed of private filter's event.
+ * This callback is called from the filter's MSTicker, unless a global event queue
+ * is created to receive all filter's notification or synchronous flag is TRUE.
+ * See ms_event_queue_new() for details.
+ *
+ * @param f        A MSFilter object.
+ * @param fn       A MSFilterNotifyFunc that will be called.
+ * @param userdata A pointer to private data.
+ * @param synchronous boolean that indicates whether this callback must be called synchronously.
+ *
+ */
+MS2_PUBLIC void ms_filter_add_notify_callback(MSFilter *f, MSFilterNotifyFunc fn, void *userdata, bool_t synchronous);
+
+/**
+ * Remove a notify callback previously entered with ms_filter_add_notify_callback()
+ *
+ * @param f        A MSFilter object.
+ * @param fn       A MSFilterNotifyFunc that will be called.
+ * @param userdata A pointer to private data.
+ *
+ */
+MS2_PUBLIC void ms_filter_remove_notify_callback(MSFilter *f, MSFilterNotifyFunc fn, void *userdata);
+
+/**
+ * Get MSFilterId's filter.
+ *
+ * @param f        A MSFilter object.
+ *
+ * Returns: MSFilterId if successfull, -1 otherwise.
+ */
+MS2_PUBLIC MSFilterId ms_filter_get_id(MSFilter *f);
+
+/**
+ * Get filter's name.
+ * @param[in] f #MSFilter object
+ * @return The name of the filter.
+ */
+MS2_PUBLIC const char * ms_filter_get_name(MSFilter *f);
+
+
+/**
+ * Obtain the list of current filter's neighbours, ie filters that are part of same graph.
+ *
+ * Returns: a MSList of MSFilter, that needs to be freed by the caller when no more needed.
+**/
+MS2_PUBLIC MSList * ms_filter_find_neighbours(MSFilter *me);
+
+/**
+ * Destroy a filter object.
+ *
+ * @param f        A MSFilter object.
+ *
+ */
+MS2_PUBLIC void ms_filter_destroy(MSFilter *f);
+
+/**
+ * Initialize a MSConnectionHelper.
+ *
+ * @param h A MSConnectionHelper, usually (but not necessarily) on stack
+ *
+**/
+MS2_PUBLIC void ms_connection_helper_start(MSConnectionHelper *h);
+
+/**
+ * \brief Enter a MSFilter to be connected into the MSConnectionHelper object.
+ *
+ * This functions enters a MSFilter to be connected into the MSConnectionHelper
+ * object and connects it to the last entered if not the first one.
+ * The MSConnectionHelper is useful to reduce the amount of code necessary to create graphs in case
+ * the connections are made in an ordered manner and some filters are present conditionally in graphs.
+ * For example, instead of writing
+ * \code
+ * ms_filter_link(f1,0,f2,1);
+ * ms_filter_link(f2,0,f3,0);
+ * ms_filter_link(f3,1,f4,0);
+ * \endcode
+ * You can write:
+ * \code
+ * MSConnectionHelper h;
+ * ms_connection_helper_start(&h);
+ * ms_connection_helper_link(&h,f1,-1,0);
+ * ms_connection_helper_link(&h,f2,1,0);
+ * ms_connection_helper_link(&h,f3,0,1);
+ * ms_connection_helper_link(&h,f4,0,-1);
+ * \endcode
+ * Which is a bit longer to write here, but now imagine f2 needs to be present in the graph only
+ * in certain conditions: in the first case you have rewrite the two first lines, in the second case
+ * you just need to replace the fourth line by:
+ * \code
+ * if (my_condition) ms_connection_helper_link(&h,f2,1,0);
+ * \endcode
+ *
+ * @param h a connection helper
+ * @param f a MSFilter
+ * @param inpin an input pin number with which the MSFilter needs to connect to previously entered MSFilter
+ * @param outpin an output pin number with which the MSFilter needs to be connected to the next entered MSFilter
+ *
+ * Returns: the return value of ms_filter_link() that is called internally to this function.
+**/
+MS2_PUBLIC int ms_connection_helper_link(MSConnectionHelper *h, MSFilter *f, int inpin, int outpin);
+
+
+/**
+ * \brief Enter a MSFilter to be disconnected into the MSConnectionHelper object.
+ * Process exactly the same way as ms_connection_helper_link() but calls ms_filter_unlink() on the
+ * entered filters.
+**/
+MS2_PUBLIC int ms_connection_helper_unlink(MSConnectionHelper *h, MSFilter *f, int inpin, int outpin);
+
+
+/**
+ * \brief Enable processing time measurements statistics for filters.
+ *
+**/
+MS2_PUBLIC MS2_DEPRECATED void ms_filter_enable_statistics(bool_t enabled);
+
+
+/**
+ * \brief Reset processing time statistics for filters.
+ *
+**/
+MS2_PUBLIC MS2_DEPRECATED void ms_filter_reset_statistics(void);
+
+/**
+ * \brief Retrieves statistics for running filters.
+ * Returns a list of MSFilterStats
+**/
+MS2_PUBLIC MS2_DEPRECATED const MSList * ms_filter_get_statistics(void);
+
+/**
+ * \brief Logs runtime statistics for running filters.
+ *
+**/
+MS2_PUBLIC MS2_DEPRECATED void ms_filter_log_statistics(void);
+
+
+
+
+/* I define the id taking the lower bits of the address of the MSFilterDesc object,
+the method index (_cnt_) and the argument size */
+/* I hope using this to avoid type mismatch (calling a method on the wrong filter)*/
+#define MS_FILTER_METHOD_ID(_id_,_cnt_,_argsize_) \
+	(unsigned int)(((((unsigned int)(_id_)) & 0xFFFF)<<16) | (((unsigned int)(_cnt_))<<8) | (((unsigned int)_argsize_) & 0xFF))
+
+/**
+ * Macro to create a method id, unique per filter.
+ * First argument shall be the filter's ID (MSFilterId) or interface ID (MSFilterInterfaceId).
+ * Second argument is the method index within the context of the filter. It should start from 0 and increment for each new method.
+ * Third argument is the argument type of the method, for example "int", "float" or any structure.
+**/
+#define MS_FILTER_METHOD(_id_,_count_,_argtype_) \
+	MS_FILTER_METHOD_ID(_id_,_count_,sizeof(_argtype_))
+
+/**
+ * Same as MS_FILTER_METHOD, but for method that do not take any argument.
+**/
+#define MS_FILTER_METHOD_NO_ARG(_id_,_count_) \
+	MS_FILTER_METHOD_ID(_id_,_count_,0)
+
+
+#define MS_FILTER_BASE_METHOD(_count_,_argtype_) \
+	MS_FILTER_METHOD_ID(MS_FILTER_BASE_ID,_count_,sizeof(_argtype_))
+
+#define MS_FILTER_BASE_METHOD_NO_ARG(_count_) \
+	MS_FILTER_METHOD_ID(MS_FILTER_BASE_ID,_count_,0)
+
+#define MS_FILTER_EVENT(_id_,_count_,_argtype_) \
+	MS_FILTER_METHOD_ID(_id_,_count_,sizeof(_argtype_))
+
+#define MS_FILTER_EVENT_NO_ARG(_id_,_count_)\
+	MS_FILTER_METHOD_ID(_id_,_count_,0)
+
+
+#define MS_FILTER_BASE_EVENT(_count_,_argtype_) \
+	MS_FILTER_EVENT(MS_FILTER_BASE_ID,_count_,_argtype_)
+
+#define MS_FILTER_BASE_EVENT_NO_ARG(_count_) \
+	MS_FILTER_EVENT_NO_ARG(MS_FILTER_BASE_ID,_count_)
+
+/**
+ *  some MSFilter base generic methods:
+ **/
+/**
+ * Set filter output/input sampling frequency in hertz
+ */
+#define MS_FILTER_SET_SAMPLE_RATE	MS_FILTER_BASE_METHOD(0,int)
+/**
+ * Get filter output/input sampling frequency in hertz
+ */
+
+#define MS_FILTER_GET_SAMPLE_RATE	MS_FILTER_BASE_METHOD(1,int)
+/**
+ * Set filter output network bitrate in bit per seconds, this value include IP+UDP+RTP overhead
+ */
+#define MS_FILTER_SET_BITRATE		MS_FILTER_BASE_METHOD(2,int)
+/**
+ * Get filter output network bitrate in bit per seconds, this value include IP+UDP+RTP overhead
+ */
+#define MS_FILTER_GET_BITRATE		MS_FILTER_BASE_METHOD(3,int)
+#define MS_FILTER_GET_NCHANNELS		MS_FILTER_BASE_METHOD(5,int)
+#define MS_FILTER_SET_NCHANNELS		MS_FILTER_BASE_METHOD(6,int)
+/**
+ * Set codec dependent attributes as taken from the SDP
+ */
+#define MS_FILTER_ADD_FMTP		MS_FILTER_BASE_METHOD(7,const char)
+
+#define MS_FILTER_ADD_ATTR		MS_FILTER_BASE_METHOD(8,const char)
+#define MS_FILTER_SET_MTU		MS_FILTER_BASE_METHOD(9,int)
+#define MS_FILTER_GET_MTU		MS_FILTER_BASE_METHOD(10,int)
+/**Filters can return their latency in milliseconds (if known) using this method:*/
+#define MS_FILTER_GET_LATENCY	MS_FILTER_BASE_METHOD(11,int)
+
+typedef struct _MSPinFormat{
+	uint16_t pin;
+	const MSFmtDescriptor *fmt;
+}MSPinFormat;
+
+/**
+ * Obtain the format of a filter on a given input
+ */
+#define MS_FILTER_GET_INPUT_FMT MS_FILTER_BASE_METHOD(30,MSPinFormat)
+/**
+ * Set the format of a filter on a given input
+ */
+#define MS_FILTER_SET_INPUT_FMT MS_FILTER_BASE_METHOD(31,MSPinFormat)
+/**
+ * Obtain the format of a filter on a given output
+ */
+#define MS_FILTER_GET_OUTPUT_FMT MS_FILTER_BASE_METHOD(32,MSPinFormat)
+/**
+ * Set the format of a filter on a given output
+ */
+#define MS_FILTER_SET_OUTPUT_FMT MS_FILTER_BASE_METHOD(33,MSPinFormat)
+
+
+/**
+ * MSFilter generic events
+**/
+#define MS_FILTER_OUTPUT_FMT_CHANGED MS_FILTER_BASE_EVENT_NO_ARG(0) /**<triggered whenever a filter decides to change its output format for one or more more output pins*/
+
+/* DEPRECATED  specific methods: to be moved into implementation specific header files - DO NOT USE IN NEW CODE*/
+#define MS_FILTER_SET_FILTERLENGTH 	MS_FILTER_BASE_METHOD(12,int)
+#define MS_FILTER_SET_OUTPUT_SAMPLE_RATE MS_FILTER_BASE_METHOD(13,int)
+#define MS_FILTER_ENABLE_DIRECTMODE	MS_FILTER_BASE_METHOD(14,int)
+#define MS_FILTER_ENABLE_VAD		MS_FILTER_BASE_METHOD(15,int)
+#define MS_FILTER_GET_STAT_DISCARDED	MS_FILTER_BASE_METHOD(16,int)
+#define MS_FILTER_GET_STAT_MISSED	MS_FILTER_BASE_METHOD(17,int)
+#define MS_FILTER_GET_STAT_INPUT	MS_FILTER_BASE_METHOD(18,int)
+#define MS_FILTER_GET_STAT_OUTPUT	MS_FILTER_BASE_METHOD(19,int)
+#define MS_FILTER_ENABLE_AGC 		MS_FILTER_BASE_METHOD(20,int)
+#define MS_FILTER_SET_PLAYBACKDELAY MS_FILTER_BASE_METHOD(21,int)
+#define MS_FILTER_ENABLE_HALFDUPLEX MS_FILTER_BASE_METHOD(22,int)
+#define MS_FILTER_SET_VAD_PROB_START MS_FILTER_BASE_METHOD(23,int)
+#define MS_FILTER_SET_VAD_PROB_CONTINUE MS_FILTER_BASE_METHOD(24,int)
+#define MS_FILTER_SET_MAX_GAIN  MS_FILTER_BASE_METHOD(25,int)
+#define MS_VIDEO_CAPTURE_SET_AUTOFOCUS MS_FILTER_BASE_METHOD(26,int)
+/* pass value of type MSRtpPayloadPickerContext copied by the filter*/
+#define MS_FILTER_SET_RTP_PAYLOAD_PICKER MS_FILTER_BASE_METHOD(27,void*)
+#define MS_FILTER_SET_OUTPUT_NCHANNELS	MS_FILTER_BASE_METHOD(28,int)
+
+
+/** @} */
+
+/*protected/ private methods*/
+MS2_PUBLIC void ms_filter_process(MSFilter *f);
+MS2_PUBLIC void ms_filter_preprocess(MSFilter *f, struct _MSTicker *t);
+MS2_PUBLIC void ms_filter_postprocess(MSFilter *f);
+MS2_PUBLIC bool_t ms_filter_inputs_have_data(MSFilter *f);
+MS2_PUBLIC void ms_filter_notify(MSFilter *f, unsigned int id, void *arg);
+MS2_PUBLIC void ms_filter_notify_no_arg(MSFilter *f, unsigned int id);
+MS2_PUBLIC void ms_filter_clear_notify_callback(MSFilter *f);
+void ms_filter_clean_pending_events(MSFilter *f);
+#define ms_filter_lock(f)	ms_mutex_lock(&(f)->lock)
+#define ms_filter_unlock(f)	ms_mutex_unlock(&(f)->lock)
+MS2_PUBLIC void ms_filter_unregister_all(void);
+
+struct _MSFilterTask{
+	MSFilter *f;
+	MSFilterFunc taskfunc;
+};
+typedef struct _MSFilterTask MSFilterTask;
+MS2_PUBLIC void ms_filter_task_process(MSFilterTask *task);
+
+/**
+ * Allow a filter to request the ticker to call him the tick after.
+ * The ticker will call the taskfunc prior to all filter's process func.
+**/
+MS2_PUBLIC void ms_filter_postpone_task(MSFilter *f, MSFilterFunc taskfunc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include "mediastreamer2/msinterfaces.h"
+#include "mediastreamer2/msfactory.h"
+/* used by awk script in Makefile.am to generate alldescs.c */
+#define MS_FILTER_DESC_EXPORT(desc)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msgenericplc.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msgenericplc.h"
new file mode 100755
index 0000000..d51f919
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msgenericplc.h"
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef msgenericplc_h
+#define msgenericplc_h
+
+#include "mediastreamer2/msvaddtx.h"
+
+#define MS_GENERIC_PLC_SET_CN	MS_FILTER_METHOD(MS_GENERIC_PLC_ID, 0, MSCngData)
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msinterfaces.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msinterfaces.h"
new file mode 100755
index 0000000..e8d51f8
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msinterfaces.h"
@@ -0,0 +1,361 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msinterfaces_h
+#define msinterfaces_h
+
+#include "mediastreamer2/mscodecutils.h"
+
+typedef struct _MSVideoCodecSLI MSVideoCodecSLI;
+
+struct _MSVideoCodecSLI {
+	uint16_t first;
+	uint16_t number;
+	uint8_t picture_id;
+};
+
+typedef struct _MSVideoCodecRPSI MSVideoCodecRPSI;
+
+struct _MSVideoCodecRPSI {
+	uint8_t *bit_string;
+	uint16_t bit_string_len;
+};
+
+typedef struct _MSVideoEncoderPixFmt MSVideoEncoderPixFmt;
+
+struct _MSVideoEncoderPixFmt {
+	uint32_t pixfmt;
+	bool_t supported;
+};
+
+/**
+ * Interface definition for video display filters.
+**/
+
+typedef struct _MSVideoDisplayDecodingSupport MSVideoDisplayDecodingSupport;
+
+struct _MSVideoDisplayDecodingSupport {
+	const char *mime_type;	/**< Input parameter to asking if the display supports decoding of this mime type */
+	bool_t supported;	/**< Output telling whether the display supports decoding to the specified mime type */
+};
+
+/** whether the video window should be resized to the stream's resolution*/
+#define MS_VIDEO_DISPLAY_ENABLE_AUTOFIT \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,0,int)
+
+/**position of the local view */
+#define MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,1,int)
+
+/**whether the video should be reversed as in mirror */
+#define MS_VIDEO_DISPLAY_ENABLE_MIRRORING \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,2,int)
+
+/**returns a platform dependant window id where the video is drawn */
+#define MS_VIDEO_DISPLAY_GET_NATIVE_WINDOW_ID \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,3,void*)
+
+
+/**Sets an external native window id where the video is to be drawn */
+#define MS_VIDEO_DISPLAY_SET_NATIVE_WINDOW_ID \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,4,void*)
+
+
+/**scale factor of the local view */
+#define MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_SCALEFACTOR \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,5,float)
+
+/**Set the background colour for video window */
+#define MS_VIDEO_DISPLAY_SET_BACKGROUND_COLOR \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,8,int[3])
+
+/**Show video. Useful to free XV port */
+#define MS_VIDEO_DISPLAY_SHOW_VIDEO \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,9,int)
+
+#define MS_VIDEO_DISPLAY_ZOOM \
+	MS_FILTER_METHOD(MSFilterVideoDisplayInterface,10,int[4])
+
+/**Specifiy device orientation from portrait */
+#define MS_VIDEO_DISPLAY_SET_DEVICE_ORIENTATION \
+   MS_FILTER_METHOD(MSFilterVideoDisplayInterface,11,int)
+
+/**
+  * Interface definitions for players
+**/
+
+enum _MSPlayerState{
+	MSPlayerClosed,
+	MSPlayerPaused,
+	MSPlayerPlaying
+};
+
+typedef enum _MSPlayerState MSPlayerState;
+
+/**open a media file*/
+#define MS_PLAYER_OPEN \
+	MS_FILTER_METHOD(MSFilterPlayerInterface,0,const char )
+
+#define MS_PLAYER_START \
+	MS_FILTER_METHOD_NO_ARG(MSFilterPlayerInterface,1)
+
+#define MS_PLAYER_PAUSE \
+	MS_FILTER_METHOD_NO_ARG(MSFilterPlayerInterface,2)
+
+#define MS_PLAYER_CLOSE \
+	MS_FILTER_METHOD_NO_ARG(MSFilterPlayerInterface,3)
+
+#define MS_PLAYER_SEEK_MS \
+	MS_FILTER_METHOD(MSFilterPlayerInterface,4,int)
+
+#define MS_PLAYER_GET_STATE \
+	MS_FILTER_METHOD(MSFilterPlayerInterface,5,MSPlayerState)
+
+/**enable loop mode. Argument is a pause interval in milliseconds to be observed between end of play and resuming at start. A value of -1 disables loop mode*/
+#define MS_PLAYER_SET_LOOP \
+	MS_FILTER_METHOD(MSFilterPlayerInterface,6,int)
+
+#define MS_PLAYER_GET_DURATION \
+	MS_FILTER_METHOD(MSFilterPlayerInterface,7,int)
+
+#define MS_PLAYER_GET_CURRENT_POSITION \
+	MS_FILTER_METHOD(MSFilterPlayerInterface,8,int)
+
+#define MS_PLAYER_EOF \
+	MS_FILTER_EVENT_NO_ARG(MSFilterPlayerInterface,0)
+
+
+/**
+  * Interface definitions for recorders
+**/
+
+enum _MSRecorderState{
+	MSRecorderClosed,
+	MSRecorderPaused,
+	MSRecorderRunning
+};
+
+typedef enum _MSRecorderState MSRecorderState;
+
+/**open a media file for recording*/
+#define MS_RECORDER_OPEN \
+	MS_FILTER_METHOD(MSFilterRecorderInterface,0,const char )
+
+#define MS_RECORDER_START \
+	MS_FILTER_METHOD_NO_ARG(MSFilterRecorderInterface,1)
+
+#define MS_RECORDER_PAUSE \
+	MS_FILTER_METHOD_NO_ARG(MSFilterRecorderInterface,2)
+
+#define MS_RECORDER_CLOSE \
+	MS_FILTER_METHOD_NO_ARG(MSFilterRecorderInterface,3)
+
+#define MS_RECORDER_GET_STATE \
+	MS_FILTER_METHOD(MSFilterRecorderInterface,5,MSRecorderState)
+
+#define MS_RECORDER_NEEDS_FIR \
+	MS_FILTER_EVENT_NO_ARG(MSFilterRecorderInterface,0)
+
+#define MS_RECORDER_SET_MAX_SIZE \
+	MS_FILTER_METHOD(MSFilterRecorderInterface,6,int)
+
+#define MS_RECORDER_MAX_SIZE_REACHED \
+	MS_FILTER_EVENT_NO_ARG(MSFilterRecorderInterface,1)
+
+
+/** Interface definitions for echo cancellers */
+
+/** sets the echo delay in milliseconds*/
+#define MS_ECHO_CANCELLER_SET_DELAY \
+	MS_FILTER_METHOD(MSFilterEchoCancellerInterface,0,int)
+
+#define MS_ECHO_CANCELLER_SET_FRAMESIZE \
+	MS_FILTER_METHOD(MSFilterEchoCancellerInterface,1,int)
+
+/** sets tail length in milliseconds */
+#define MS_ECHO_CANCELLER_SET_TAIL_LENGTH \
+	MS_FILTER_METHOD(MSFilterEchoCancellerInterface,2,int)
+
+/** put filter in bypass mode */
+#define MS_ECHO_CANCELLER_SET_BYPASS_MODE \
+	MS_FILTER_METHOD(MSFilterEchoCancellerInterface,3,bool_t)
+/** get filter bypass mode */
+#define MS_ECHO_CANCELLER_GET_BYPASS_MODE \
+	MS_FILTER_METHOD(MSFilterEchoCancellerInterface,4,bool_t)
+
+/** retrieve echo canceller internal state, as a base64 encoded string */
+#define MS_ECHO_CANCELLER_GET_STATE_STRING \
+	MS_FILTER_METHOD(MSFilterEchoCancellerInterface,5,char *)
+
+/** restore a previous state suppling the echo canceller config as base64 encoded string */
+#define MS_ECHO_CANCELLER_SET_STATE_STRING \
+	MS_FILTER_METHOD(MSFilterEchoCancellerInterface,6, const char)
+
+
+
+/** Event definitions for video decoders */
+#define MS_VIDEO_DECODER_DECODING_ERRORS \
+	MS_FILTER_EVENT_NO_ARG(MSFilterVideoDecoderInterface,0)
+#define MS_VIDEO_DECODER_FIRST_IMAGE_DECODED \
+	MS_FILTER_EVENT_NO_ARG(MSFilterVideoDecoderInterface,1)
+#define MS_VIDEO_DECODER_SEND_PLI \
+	MS_FILTER_EVENT_NO_ARG(MSFilterVideoDecoderInterface, 2)
+#define MS_VIDEO_DECODER_SEND_SLI \
+	MS_FILTER_EVENT(MSFilterVideoDecoderInterface, 3, MSVideoCodecSLI)
+#define MS_VIDEO_DECODER_SEND_RPSI \
+	MS_FILTER_EVENT(MSFilterVideoDecoderInterface, 4, MSVideoCodecRPSI)
+#define MS_VIDEO_DECODER_SEND_FIR \
+	MS_FILTER_EVENT_NO_ARG(MSFilterVideoDecoderInterface, 5)
+
+/** Method definitions for video decoders */
+#define MS_VIDEO_DECODER_RESET_FIRST_IMAGE_NOTIFICATION \
+	MS_FILTER_METHOD_NO_ARG(MSFilterVideoDecoderInterface, 5)
+#define MS_VIDEO_DECODER_ENABLE_AVPF \
+	MS_FILTER_METHOD(MSFilterVideoDecoderInterface, 6, bool_t)
+#define MS_VIDEO_DECODER_SUPPORT_RENDERING \
+	MS_FILTER_METHOD(MSFilterVideoDecoderInterface, 7, MSVideoDisplayDecodingSupport)
+#define MS_VIDEO_DECODER_FREEZE_ON_ERROR \
+	MS_FILTER_METHOD(MSFilterVideoDecoderInterface, 8, bool_t)
+#define MS_VIDEO_DECODER_RECOVERED_FROM_ERRORS \
+	MS_FILTER_EVENT_NO_ARG(MSFilterVideoDecoderInterface, 9)
+#define MS_VIDEO_DECODER_RESET \
+	MS_FILTER_METHOD_NO_ARG(MSFilterVideoDecoderInterface, 10)
+#define MS_VIDEO_DECODER_FREEZE_ON_ERROR_ENABLED \
+	MS_FILTER_METHOD(MSFilterVideoDecoderInterface, 11, bool_t)
+
+
+
+/** Interface definitions for video capture */
+#define MS_VIDEO_CAPTURE_SET_DEVICE_ORIENTATION \
+	MS_FILTER_METHOD(MSFilterVideoCaptureInterface, 0,int)
+#define MS_VIDEO_CAPTURE_GET_CAMERA_SENSOR_ROTATION \
+	MS_FILTER_METHOD(MSFilterVideoCaptureInterface, 1, int)
+#define MS_CAMERA_PREVIEW_SIZE_CHANGED \
+	MS_FILTER_EVENT(MS_ANDROID_VIDEO_READ_ID, 0, MSVideoSize)
+
+/** Interface definitions for audio decoder */
+
+#define MS_AUDIO_DECODER_HAVE_PLC \
+	MS_FILTER_METHOD(MSFilterAudioDecoderInterface,0,int)
+
+#define MS_DECODER_HAVE_PLC MS_AUDIO_DECODER_HAVE_PLC /*for backward compatibility*/
+
+#define MS_AUDIO_DECODER_SET_RTP_PAYLOAD_PICKER \
+	MS_FILTER_METHOD(MSFilterAudioDecoderInterface,1,MSRtpPayloadPickerContext)
+
+#define MS_DECODER_ENABLE_PLC MS_FILTER_METHOD(MSFilterAudioDecoderInterface,2,int)
+/**
+ * Interface definition for video encoders.
+**/
+
+#define MS_VIDEO_ENCODER_SUPPORTS_PIXFMT \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 0, MSVideoEncoderPixFmt)
+/* request a video-fast-update (=I frame for H263,MP4V-ES) to a video encoder*/
+#define MS_VIDEO_ENCODER_REQ_VFU \
+	MS_FILTER_METHOD_NO_ARG(MSFilterVideoEncoderInterface, 1)
+#define MS_VIDEO_ENCODER_GET_CONFIGURATION_LIST \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 2, const MSVideoConfiguration *)
+#define MS_VIDEO_ENCODER_SET_CONFIGURATION \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 3, const MSVideoConfiguration )
+#define MS_VIDEO_ENCODER_NOTIFY_PLI \
+	MS_FILTER_METHOD_NO_ARG(MSFilterVideoEncoderInterface, 4)
+#define MS_VIDEO_ENCODER_NOTIFY_FIR \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 5, uint8_t *)
+#define MS_VIDEO_ENCODER_NOTIFY_SLI \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 6, MSVideoCodecSLI)
+#define MS_VIDEO_ENCODER_NOTIFY_RPSI \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 7, MSVideoCodecRPSI)
+#define MS_VIDEO_ENCODER_ENABLE_AVPF \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 8, bool_t)
+#define MS_VIDEO_ENCODER_SET_CONFIGURATION_LIST \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 9, const MSVideoConfiguration *)
+#define MS_VIDEO_ENCODER_IS_HARDWARE_ACCELERATED \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 10, bool_t)
+#define MS_VIDEO_ENCODER_GET_CONFIGURATION \
+	MS_FILTER_METHOD(MSFilterVideoEncoderInterface, 11, MSVideoConfiguration )
+
+/** Interface definitions for audio capture */
+/* Start numbering from the end for hacks */
+#define MS_AUDIO_CAPTURE_SET_VOLUME_GAIN \
+	MS_FILTER_METHOD(MSFilterAudioCaptureInterface, 0, float)
+#define MS_AUDIO_CAPTURE_GET_VOLUME_GAIN \
+	MS_FILTER_METHOD(MSFilterAudioCaptureInterface, 1, float)
+#define MS_AUDIO_CAPTURE_FORCE_SPEAKER_STATE \
+	MS_FILTER_METHOD(MSFilterAudioCaptureInterface, 255, bool_t)
+
+/** Interface definitions for audio playback */
+enum _MSAudioRoute{
+	MSAudioRouteEarpiece,
+	MSAudioRouteSpeaker
+};
+typedef enum _MSAudioRoute MSAudioRoute;
+
+#define MS_AUDIO_PLAYBACK_SET_VOLUME_GAIN \
+	MS_FILTER_METHOD(MSFilterAudioPlaybackInterface, 0, float)
+#define MS_AUDIO_PLAYBACK_GET_VOLUME_GAIN \
+	MS_FILTER_METHOD(MSFilterAudioPlaybackInterface, 1, float)
+#define MS_AUDIO_PLAYBACK_SET_ROUTE \
+	MS_FILTER_METHOD(MSFilterAudioPlaybackInterface, 2, MSAudioRoute)
+#define MS_AUDIO_PLAYBACK_MUTE \
+	MS_FILTER_METHOD(MSFilterAudioPlaybackInterface, 3, int)
+
+/** Interface definitions for audio encoder */
+#define MS_AUDIO_ENCODER_SET_PTIME \
+	MS_FILTER_METHOD(MSFilterAudioEncoderInterface,0,int)
+
+#define MS_AUDIO_ENCODER_GET_PTIME \
+	MS_FILTER_METHOD(MSFilterAudioEncoderInterface,1,int)
+
+/* Enable encoder's builtin forward error correction, if available*/
+#define MS_AUDIO_ENCODER_ENABLE_FEC \
+	MS_FILTER_METHOD(MSFilterAudioEncoderInterface,2,int)
+
+/* Set the packet loss percentage reported, so that encoder may compensate if forward-correction is enabled and implemented.*/
+#define MS_AUDIO_ENCODER_SET_PACKET_LOSS \
+	MS_FILTER_METHOD(MSFilterAudioEncoderInterface,3,int)
+
+#define MS_AUDIO_ENCODER_CAP_AUTO_PTIME (1)
+
+#define MS_AUDIO_ENCODER_GET_CAPABILITIES \
+	MS_FILTER_METHOD(MSFilterAudioEncoderInterface,4,int)
+
+/** Interface definitions for VAD */
+#define MS_VAD_ENABLE_SILENCE_DETECTION \
+	MS_FILTER_METHOD(MSFilterVADInterface, 0, int)
+
+/* Set the silence duration threshold in ms */
+#define MS_VAD_SET_SILENCE_DURATION_THRESHOLD \
+	MS_FILTER_METHOD(MSFilterVADInterface, 1, unsigned int)
+
+/* Specific to each VAD implementation */
+#define MS_VAD_SET_MODE \
+	MS_FILTER_METHOD(MSFilterVADInterface, 2, int)
+
+#define MS_VAD_EVENT_SILENCE_DETECTED \
+	MS_FILTER_EVENT_NO_ARG(MSFilterVADInterface, 0)
+
+/* Give the end of silence and duration in ms */
+#define MS_VAD_EVENT_SILENCE_ENDED \
+	MS_FILTER_EVENT(MSFilterVADInterface, 1, unsigned int)
+
+/** Interface definitions for void source/sink */
+#define MS_VOID_SOURCE_SEND_SILENCE \
+	MS_FILTER_METHOD(MSFilterVoidInterface, 0, bool_t)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msitc.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msitc.h"
new file mode 100755
index 0000000..b34d211
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msitc.h"
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef msitc_h
+#define msitc_h
+
+#include <mediastreamer2/msfilter.h>
+
+#define MS_ITC_SINK_CONNECT MS_FILTER_METHOD(MS_ITC_SINK_ID,0,MSFilter)
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msjava.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msjava.h"
new file mode 100755
index 0000000..98dd094
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msjava.h"
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msjava_h
+#define msjava_h
+
+/* Helper routines for filters that use a jvm with upcalls to perform some processing */
+
+#include <jni.h>
+#include <bctoolbox/list.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+void ms_set_jvm(JavaVM *vm);
+
+JavaVM *ms_get_jvm(void);
+
+JNIEnv *ms_get_jni_env(void);
+
+#ifdef __ANDROID__
+int ms_get_android_sdk_version(void);
+bctbx_list_t *ms_get_android_plugins_list(void);
+char * ms_get_android_libraries_path(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msjpegwriter.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msjpegwriter.h"
new file mode 100755
index 0000000..622ea53
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msjpegwriter.h"
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msjpegwriter_h
+#define msjpegwriter_h
+
+#include <mediastreamer2/msfilter.h>
+
+#define MS_JPEG_WRITER_TAKE_SNAPSHOT	MS_FILTER_METHOD(MS_JPEG_WRITER_ID, 0, const char)
+#define MS_JPEG_WRITER_SNAPSHOT_TAKEN 	MS_FILTER_EVENT(MS_JPEG_WRITER_ID, 0, const char)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msmediaplayer.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msmediaplayer.h"
new file mode 100755
index 0000000..6f089bf
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msmediaplayer.h"
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MS_MEDIA_PLAYER_H
+#define MS_MEDIA_PLAYER_H
+
+#include <mediastreamer2/mssndcard.h>
+#include <mediastreamer2/msinterfaces.h>
+#include <mediastreamer2/msvideo.h>
+
+/**
+ * Media file player
+ */
+typedef struct _MSMediaPlayer MSMediaPlayer;
+
+/**
+ * Callbacks definitions */
+typedef void (*MSMediaPlayerEofCallback)(void *user_data);
+
+typedef enum {
+	MS_FILE_FORMAT_UNKNOWN,
+	MS_FILE_FORMAT_WAVE,
+	MS_FILE_FORMAT_MATROSKA
+} MSFileFormat;
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Instanciate a media player
+ * @param factory a MSFactory
+ * @param snd_card Playback sound card
+ * @param video_display_name Video out
+ * @param window_id Pointer on the drawing window
+ * @return A pointer on the created MSMediaPlayer
+ */
+MS2_PUBLIC MSMediaPlayer *ms_media_player_new(MSFactory *factory, MSSndCard *snd_card, const char *video_display_name, void *window_id);
+
+/**
+ * Free a media player
+ * @param obj Pointer on the MSMediaPlayer to free
+ */
+MS2_PUBLIC void ms_media_player_free(MSMediaPlayer *obj);
+
+/**
+ * Get the window ID
+ * @param obj The player
+ * @return The window ID
+ */
+MS2_PUBLIC void * ms_media_player_get_window_id(const MSMediaPlayer *obj);
+
+/**
+ * Set the "End of File" callback
+ * @param obj The player
+ * @param cb Function to call
+ * @param user_data Data which will be passed to the function
+ */
+MS2_PUBLIC void ms_media_player_set_eof_callback(MSMediaPlayer *obj, MSMediaPlayerEofCallback cb, void *user_data);
+
+/**
+ * Require the player for playing the file again when the end is reached. Then,
+ * the player loops indefinitely until ms_media_player_stop() is called. That function
+ * can be called while the player is running.
+ * @param obj The MSMediaPlayer instance
+ * @param loop_interval_ms Time interval beetween two plays. If a negative value is
+ * set, the player does not loop.
+ */
+MS2_PUBLIC void ms_media_player_set_loop(MSMediaPlayer *obj, int loop_interval_ms);
+
+/**
+ * Open a media file
+ * @param obj The player
+ * @param filepath Path of the file to open
+ * @return TRUE if the file could be opened
+ */
+MS2_PUBLIC bool_t ms_media_player_open(MSMediaPlayer *obj, const char *filepath);
+
+/**
+ * Close a media file
+ * That function can be safly call even if no file has been opend
+ * @param obj The player
+ */
+MS2_PUBLIC void ms_media_player_close(MSMediaPlayer *obj);
+
+/**
+ * Start playback
+ * @param obj The player
+ * @return TRUE if playback has been successfuly started
+ */
+MS2_PUBLIC bool_t ms_media_player_start(MSMediaPlayer *obj);
+
+/**
+ * Stop a playback
+ * When a playback is stoped, the player automatically seek at
+ * the begining of the file.
+ * @param obj The player
+ */
+MS2_PUBLIC void ms_media_player_stop(MSMediaPlayer *obj);
+
+/**
+ * Turn playback to paused.
+ * @param obj The player
+ */
+MS2_PUBLIC void ms_media_player_pause(MSMediaPlayer *obj);
+
+/**
+ * Seek into the opened file
+ * Can be safly call when playback is runing
+ * @param obj The player
+ * @param seek_pos_ms Position where to seek on (in milliseconds)
+ * @return
+ */
+MS2_PUBLIC bool_t ms_media_player_seek(MSMediaPlayer *obj, int seek_pos_ms);
+
+/**
+ * Get the state of the player
+ * @param obj The player
+ * @return An MSPLayerSate enum
+ */
+MS2_PUBLIC MSPlayerState ms_media_player_get_state(MSMediaPlayer *obj);
+
+/**
+ * Get the duration of the opened media
+ * @param obj The player
+ * @return The duration in milliseconds. -1 if failure
+ */
+MS2_PUBLIC int ms_media_player_get_duration(MSMediaPlayer *obj);
+
+/**
+ * Get the position of the playback
+ * @param obj The player
+ * @return The position in milliseconds. -1 if failure
+ */
+MS2_PUBLIC int ms_media_player_get_current_position(MSMediaPlayer *obj);
+
+/**
+ * Check whether Matroska format is supported by the player
+ * @return TRUE if supported
+ */
+MS2_PUBLIC bool_t ms_media_player_matroska_supported(void);
+
+/**
+ * Return format of the current opened file
+ * @param obj Player
+ * @return Format of the file. UNKNOWN_FORMAT when no file is opened
+ */
+MS2_PUBLIC MSFileFormat ms_media_player_get_file_format(const MSMediaPlayer *obj);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msogl.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msogl.h"
new file mode 100755
index 0000000..ac50792
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msogl.h"
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msogl_h
+#define msogl_h
+
+#define MS_OGL_RENDER MS_FILTER_METHOD_NO_ARG(MS_OGL_ID, 0)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msogl_functions.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msogl_functions.h"
new file mode 100755
index 0000000..632c605
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msogl_functions.h"
@@ -0,0 +1,338 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msogl_functions_h
+#define msogl_functions_h
+
+#ifdef __APPLE__
+   #include "TargetConditionals.h"
+#endif
+
+#if TARGET_OS_IPHONE
+	#include <OpenGLES/ES2/gl.h>
+	#include <OpenGLES/ES2/glext.h>
+#elif TARGET_OS_MAC
+	#include <OpenGL/OpenGL.h>
+	#include <OpenGL/gl.h>
+#elif __ANDROID__
+	#include <GLES2/gl2.h>
+	#include <GLES2/gl2ext.h>
+#elif _WIN32
+	#if !defined(QOPENGLFUNCTIONS_H)
+		#include <GLES3/gl3.h>
+	#endif
+#elif !defined(QOPENGLFUNCTIONS_H) // glew is already included by QT.
+	#include <GL/glew.h>
+#endif
+
+// =============================================================================
+
+typedef void (*resolveGlActiveTexture)(GLenum texture);
+typedef void (*resolveGlAttachShader)(GLuint program, GLuint shader);
+typedef void (*resolveGlBindAttribLocation)(GLuint program, GLuint index, const char *name);
+typedef void (*resolveGlBindBuffer)(GLenum target, GLuint buffer);
+typedef void (*resolveGlBindFramebuffer)(GLenum target, GLuint framebuffer);
+typedef void (*resolveGlBindRenderbuffer)(GLenum target, GLuint renderbuffer);
+typedef void (*resolveGlBindTexture)(GLenum target, GLuint texture);
+typedef void (*resolveGlBlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+typedef void (*resolveGlBlendEquation)(GLenum mode);
+typedef void (*resolveGlBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha);
+typedef void (*resolveGlBlendFunc)(GLenum sfactor, GLenum dfactor);
+typedef void (*resolveGlBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (*resolveGlBufferData)(GLenum target, GLsizei *size, const void *data, GLenum usage);
+typedef void (*resolveGlBufferSubData)(GLenum target, GLint *offset, GLsizei *size, const void *data);
+typedef GLenum (*resolveGlCheckFramebufferStatus)(GLenum target);
+typedef void (*resolveGlClear)(GLbitfield mask);
+typedef void (*resolveGlClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
+typedef void (*resolveGlClearDepthf)(GLclampf depth);
+typedef void (*resolveGlClearStencil)(GLint s);
+typedef void (*resolveGlColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
+typedef void (*resolveGlCompileShader)(GLuint shader);
+typedef void (*resolveGlCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data);
+typedef void (*resolveGlCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data);
+typedef void (*resolveGlCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
+typedef void (*resolveGlCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
+typedef GLuint (*resolveGlCreateProgram)(void);
+typedef GLuint (*resolveGlCreateShader)(GLenum type);
+typedef void (*resolveGlCullFace)(GLenum mode);
+typedef void (*resolveGlDeleteBuffers)(GLsizei n, const GLuint *buffers);
+typedef void (*resolveGlDeleteFramebuffers)(GLsizei n, const GLuint *framebuffers);
+typedef void (*resolveGlDeleteProgram)(GLuint program);
+typedef void (*resolveGlDeleteRenderbuffers)(GLsizei n, const GLuint *renderbuffers);
+typedef void (*resolveGlDeleteShader)(GLuint shader);
+typedef void (*resolveGlDeleteTextures)(GLsizei n, const GLuint *textures);
+typedef void (*resolveGlDepthFunc)(GLenum func);
+typedef void (*resolveGlDepthMask)(GLboolean flag);
+typedef void (*resolveGlDepthRangef)(GLclampf zNear, GLclampf zFar);
+typedef void (*resolveGlDetachShader)(GLuint program, GLuint shader);
+typedef void (*resolveGlDisable)(GLenum cap);
+typedef void (*resolveGlDisableVertexAttribArray)(GLuint index);
+typedef void (*resolveGlDrawArrays)(GLenum mode, GLint first, GLsizei count);
+typedef void (*resolveGlDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
+typedef void (*resolveGlEnable)(GLenum cap);
+typedef void (*resolveGlEnableVertexAttribArray)(GLuint index);
+typedef void (*resolveGlFinish)(void);
+typedef void (*resolveGlFlush)(void);
+typedef void (*resolveGlFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
+typedef void (*resolveGlFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
+typedef void (*resolveGlFrontFace)(GLenum mode);
+typedef void (*resolveGlGenBuffers)(GLsizei n, GLuint *buffers);
+typedef void (*resolveGlGenFramebuffers)(GLsizei n, GLuint *framebuffers);
+typedef void (*resolveGlGenRenderbuffers)(GLsizei n, GLuint *renderbuffers);
+typedef void (*resolveGlGenTextures)(GLsizei n, GLuint *textures);
+typedef void (*resolveGlGenerateMipmap)(GLenum target);
+typedef void (*resolveGlGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, char *name);
+typedef void (*resolveGlGetActiveUniform)(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, char *name);
+typedef void (*resolveGlGetAttachedShaders)(GLuint program, GLsizei maxcount, GLsizei *count, GLuint *shaders);
+typedef GLint (*resolveGlGetAttribLocation)(GLuint program, const char *name);
+typedef void (*resolveGlGetBooleanv)(GLenum pname, GLboolean *params);
+typedef void (*resolveGlGetBufferParameteriv)(GLenum target, GLenum pname, GLint *params);
+typedef GLenum (*resolveGlGetError)(void);
+typedef void (*resolveGlGetFloatv)(GLenum pname, GLfloat *params);
+typedef void (*resolveGlGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
+typedef void (*resolveGlGetIntegerv)(GLenum pname, GLint *params);
+typedef void (*resolveGlGetProgramInfoLog)(GLuint program, GLsizei bufsize, GLsizei *length, char *infolog);
+typedef void (*resolveGlGetProgramiv)(GLuint program, GLenum pname, GLint *params);
+typedef void (*resolveGlGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint *params);
+typedef void (*resolveGlGetShaderInfoLog)(GLuint shader, GLsizei bufsize, GLsizei *length, char *infolog);
+typedef void (*resolveGlGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision);
+typedef void (*resolveGlGetShaderSource)(GLuint shader, GLsizei bufsize, GLsizei *length, char *source);
+typedef void (*resolveGlGetShaderiv)(GLuint shader, GLenum pname, GLint *params);
+typedef const GLubyte *(*resolveGlGetString)(GLenum name);
+typedef void (*resolveGlGetTexParameterfv)(GLenum target, GLenum pname, GLfloat *params);
+typedef void (*resolveGlGetTexParameteriv)(GLenum target, GLenum pname, GLint *params);
+typedef GLint (*resolveGlGetUniformLocation)(GLuint program, const char *name);
+typedef void (*resolveGlGetUniformfv)(GLuint program, GLint location, GLfloat *params);
+typedef void (*resolveGlGetUniformiv)(GLuint program, GLint location, GLint *params);
+typedef void (*resolveGlGetVertexAttribPointerv)(GLuint index, GLenum pname, void **pointer);
+typedef void (*resolveGlGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat *params);
+typedef void (*resolveGlGetVertexAttribiv)(GLuint index, GLenum pname, GLint *params);
+typedef void (*resolveGlHint)(GLenum target, GLenum mode);
+typedef GLboolean (*resolveGlIsBuffer)(GLuint buffer);
+typedef GLboolean (*resolveGlIsEnabled)(GLenum cap);
+typedef GLboolean (*resolveGlIsFramebuffer)(GLuint framebuffer);
+typedef GLboolean (*resolveGlIsProgram)(GLuint program);
+typedef GLboolean (*resolveGlIsRenderbuffer)(GLuint renderbuffer);
+typedef GLboolean (*resolveGlIsShader)(GLuint shader);
+typedef GLboolean (*resolveGlIsTexture)(GLuint texture);
+typedef void (*resolveGlLineWidth)(GLfloat width);
+typedef void (*resolveGlLinkProgram)(GLuint program);
+typedef void (*resolveGlPixelStorei)(GLenum pname, GLint param);
+typedef void (*resolveGlPolygonOffset)(GLfloat factor, GLfloat units);
+typedef void (*resolveGlReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
+typedef void (*resolveGlReleaseShaderCompiler)(void);
+typedef void (*resolveGlRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
+typedef void (*resolveGlSampleCoverage)(GLclampf value, GLboolean invert);
+typedef void (*resolveGlScissor)(GLint x, GLint y, GLsizei width, GLsizei height);
+typedef void (*resolveGlShaderBinary)(GLint n, const GLuint *shaders, GLenum binaryformat, const void *binary, GLint length);
+typedef void (*resolveGlShaderSource)(GLuint shader, GLsizei count, const char **string, const GLint *length);
+typedef void (*resolveGlStencilFunc)(GLenum func, GLint ref, GLuint mask);
+typedef void (*resolveGlStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask);
+typedef void (*resolveGlStencilMask)(GLuint mask);
+typedef void (*resolveGlStencilMaskSeparate)(GLenum face, GLuint mask);
+typedef void (*resolveGlStencilOp)(GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (*resolveGlStencilOpSeparate)(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
+typedef void (*resolveGlTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (*resolveGlTexParameterf)(GLenum target, GLenum pname, GLfloat param);
+typedef void (*resolveGlTexParameterfv)(GLenum target, GLenum pname, const GLfloat *params);
+typedef void (*resolveGlTexParameteri)(GLenum target, GLenum pname, GLint param);
+typedef void (*resolveGlTexParameteriv)(GLenum target, GLenum pname, const GLint *params);
+typedef void (*resolveGlTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
+typedef void (*resolveGlUniform1f)(GLint location, GLfloat x);
+typedef void (*resolveGlUniform1fv)(GLint location, GLsizei count, const GLfloat *v);
+typedef void (*resolveGlUniform1i)(GLint location, GLint x);
+typedef void (*resolveGlUniform1iv)(GLint location, GLsizei count, const GLint *v);
+typedef void (*resolveGlUniform2f)(GLint location, GLfloat x, GLfloat y);
+typedef void (*resolveGlUniform2fv)(GLint location, GLsizei count, const GLfloat *v);
+typedef void (*resolveGlUniform2i)(GLint location, GLint x, GLint y);
+typedef void (*resolveGlUniform2iv)(GLint location, GLsizei count, const GLint *v);
+typedef void (*resolveGlUniform3f)(GLint location, GLfloat x, GLfloat y, GLfloat z);
+typedef void (*resolveGlUniform3fv)(GLint location, GLsizei count, const GLfloat *v);
+typedef void (*resolveGlUniform3i)(GLint location, GLint x, GLint y, GLint z);
+typedef void (*resolveGlUniform3iv)(GLint location, GLsizei count, const GLint *v);
+typedef void (*resolveGlUniform4f)(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (*resolveGlUniform4fv)(GLint location, GLsizei count, const GLfloat *v);
+typedef void (*resolveGlUniform4i)(GLint location, GLint x, GLint y, GLint z, GLint w);
+typedef void (*resolveGlUniform4iv)(GLint location, GLsizei count, const GLint *v);
+typedef void (*resolveGlUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (*resolveGlUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (*resolveGlUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
+typedef void (*resolveGlUseProgram)(GLuint program);
+typedef void (*resolveGlValidateProgram)(GLuint program);
+typedef void (*resolveGlVertexAttrib1f)(GLuint indx, GLfloat x);
+typedef void (*resolveGlVertexAttrib1fv)(GLuint indx, const GLfloat *values);
+typedef void (*resolveGlVertexAttrib2f)(GLuint indx, GLfloat x, GLfloat y);
+typedef void (*resolveGlVertexAttrib2fv)(GLuint indx, const GLfloat *values);
+typedef void (*resolveGlVertexAttrib3f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z);
+typedef void (*resolveGlVertexAttrib3fv)(GLuint indx, const GLfloat *values);
+typedef void (*resolveGlVertexAttrib4f)(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (*resolveGlVertexAttrib4fv)(GLuint indx, const GLfloat *values);
+typedef void (*resolveGlVertexAttribPointer)(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *ptr);
+typedef void (*resolveGlViewport)(GLint x, GLint y, GLsizei width, GLsizei height);
+
+// -----------------------------------------------------------------------------
+
+struct OpenGlFunctions {
+	resolveGlActiveTexture glActiveTexture;
+	resolveGlAttachShader glAttachShader;
+	resolveGlBindAttribLocation glBindAttribLocation;
+	// resolveGlBindBuffer glBindBuffer;
+	// resolveGlBindFramebuffer glBindFramebuffer;
+	// resolveGlBindRenderbuffer glBindRenderbuffer;
+	resolveGlBindTexture glBindTexture;
+	// resolveGlBlendColor glBlendColor;
+	// resolveGlBlendEquation glBlendEquation;
+	// resolveGlBlendEquationSeparate glBlendEquationSeparate;
+	// resolveGlBlendFunc glBlendFunc;
+	// resolveGlBlendFuncSeparate glBlendFuncSeparate;
+	// resolveGlBufferData glBufferData;
+	// resolveGlBufferSubData glBufferSubData;
+	// resolveGlCheckFramebufferStatus glCheckFramebufferStatus;
+	resolveGlClear glClear;
+	resolveGlClearColor glClearColor;
+	// resolveGlClearDepthf glClearDepthf;
+	// resolveGlClearStencil glClearStencil;
+	// resolveGlColorMask glColorMask;
+	resolveGlCompileShader glCompileShader;
+	// resolveGlCompressedTexImage2D glCompressedTexImage2D;
+	// resolveGlCompressedTexSubImage2D glCompressedTexSubImage2D;
+	// resolveGlCopyTexImage2D glCopyTexImage2D;
+	// resolveGlCopyTexSubImage2D glCopyTexSubImage2D;
+	resolveGlCreateProgram glCreateProgram;
+	resolveGlCreateShader glCreateShader;
+	// resolveGlCullFace glCullFace;
+	// resolveGlDeleteBuffers glDeleteBuffers;
+	// resolveGlDeleteFramebuffers glDeleteFramebuffers;
+	resolveGlDeleteProgram glDeleteProgram;
+	//resolveGlDeleteRenderbuffers glDeleteRenderbuffers;
+	resolveGlDeleteShader glDeleteShader;
+	resolveGlDeleteTextures glDeleteTextures;
+	// resolveGlDepthFunc glDepthFunc;
+	// resolveGlDepthMask glDepthMask;
+	// resolveGlDepthRangef glDepthRangef;
+	// resolveGlDetachShader glDetachShader;
+	resolveGlDisable glDisable;
+	// resolveGlDisableVertexAttribArray glDisableVertexAttribArray;
+	resolveGlDrawArrays glDrawArrays;
+	// resolveGlDrawElements glDrawElements;
+	// resolveGlEnable glEnable;
+	resolveGlEnableVertexAttribArray glEnableVertexAttribArray;
+	// resolveGlFinish glFinish;
+	// resolveGlFlush glFlush;
+	// resolveGlFramebufferRenderbuffer glFramebufferRenderbuffer;
+	// resolveGlFramebufferTexture2D glFramebufferTexture2D;
+	// resolveGlFrontFace glFrontFace;
+	// resolveGlGenBuffers glGenBuffers;
+	// resolveGlGenFramebuffers glGenFramebuffers;
+	// resolveGlGenRenderbuffers glGenRenderbuffers;
+	resolveGlGenTextures glGenTextures;
+	// resolveGlGenerateMipmap glGenerateMipmap;
+	// resolveGlGetActiveAttrib glGetActiveAttrib;
+	// resolveGlGetActiveUniform glGetActiveUniform;
+	// resolveGlGetAttachedShaders glGetAttachedShaders;
+	// resolveGlGetAttribLocation glGetAttribLocation;
+	// resolveGlGetBooleanv glGetBooleanv;
+	// resolveGlGetBufferParameteriv glGetBufferParameteriv;
+	resolveGlGetError glGetError;
+	// resolveGlGetFloatv glGetFloatv;
+	// resolveGlGetFramebufferAttachmentParameteriv glGetFramebufferAttachmentParameteriv;
+	// resolveGlGetIntegerv glGetIntegerv;
+	resolveGlGetProgramInfoLog glGetProgramInfoLog;
+	resolveGlGetProgramiv glGetProgramiv;
+	// resolveGlGetRenderbufferParameteriv glGetRenderbufferParameteriv;
+	resolveGlGetShaderInfoLog glGetShaderInfoLog;
+	// resolveGlGetShaderPrecisionFormat glGetShaderPrecisionFormat;
+	// resolveGlGetShaderSource glGetShaderSource;
+	resolveGlGetShaderiv glGetShaderiv;
+	resolveGlGetString glGetString;
+	// resolveGlGetTexParameterfv glGetTexParameterfv;
+	// resolveGlGetTexParameteriv glGetTexParameteriv;
+	resolveGlGetUniformLocation glGetUniformLocation;
+	// resolveGlGetUniformfv glGetUniformfv;
+	// resolveGlGetUniformiv glGetUniformiv;
+	// resolveGlGetVertexAttribPointerv glGetVertexAttribPointerv;
+	// resolveGlGetVertexAttribfv glGetVertexAttribfv;
+	// resolveGlGetVertexAttribiv glGetVertexAttribiv;
+	// resolveGlHint glHint;
+	// resolveGlIsBuffer glIsBuffer;
+	// resolveGlIsEnabled glIsEnabled;
+	// resolveGlIsFramebuffer glIsFramebuffer;
+	// resolveGlIsProgram glIsProgram;
+	// resolveGlIsRenderbuffer glIsRenderbuffer;
+	// resolveGlIsShader glIsShader;
+	// resolveGlIsTexture glIsTexture;
+	// resolveGlLineWidth glLineWidth;
+	resolveGlLinkProgram glLinkProgram;
+	resolveGlPixelStorei glPixelStorei;
+	// resolveGlPolygonOffset glPolygonOffset;
+	// resolveGlReadPixels glReadPixels;
+	// resolveGlReleaseShaderCompiler glReleaseShaderCompiler;
+	// resolveGlRenderbufferStorage glRenderbufferStorage;
+	// resolveGlSampleCoverage glSampleCoverage;
+	// resolveGlScissor glScissor;
+	// resolveGlShaderBinary glShaderBinary;
+	resolveGlShaderSource glShaderSource;
+	// resolveGlStencilFunc glStencilFunc;
+	// resolveGlStencilFuncSeparate glStencilFuncSeparate;
+	// resolveGlStencilMask glStencilMask;
+	// resolveGlStencilMaskSeparate glStencilMaskSeparate;
+	// resolveGlStencilOp glStencilOp;
+	// resolveGlStencilOpSeparate glStencilOpSeparate;
+	resolveGlTexImage2D glTexImage2D;
+	// resolveGlTexParameterf glTexParameterf;
+	// resolveGlTexParameterfv glTexParameterfv;
+	resolveGlTexParameteri glTexParameteri;
+	// resolveGlTexParameteriv glTexParameteriv;
+	resolveGlTexSubImage2D glTexSubImage2D;
+	resolveGlUniform1f glUniform1f;
+	// resolveGlUniform1fv glUniform1fv;
+	resolveGlUniform1i glUniform1i;
+	// resolveGlUniform1iv glUniform1iv;
+	// resolveGlUniform2f glUniform2f;
+	// resolveGlUniform2fv glUniform2fv;
+	// resolveGlUniform2i glUniform2i;
+	// resolveGlUniform2iv glUniform2iv;
+	// resolveGlUniform3f glUniform3f;
+	// resolveGlUniform3fv glUniform3fv;
+	// resolveGlUniform3i glUniform3i;
+	// resolveGlUniform3iv glUniform3iv;
+	// resolveGlUniform4f glUniform4f;
+	// resolveGlUniform4fv glUniform4fv;
+	// resolveGlUniform4i glUniform4i;
+	// resolveGlUniform4iv glUniform4iv;
+	// resolveGlUniformMatrix2fv glUniformMatrix2fv;
+	// resolveGlUniformMatrix3fv glUniformMatrix3fv;
+	resolveGlUniformMatrix4fv glUniformMatrix4fv;
+	resolveGlUseProgram glUseProgram;
+	resolveGlValidateProgram glValidateProgram;
+	// resolveGlVertexAttrib1f glVertexAttrib1f;
+	// resolveGlVertexAttrib1fv glVertexAttrib1fv;
+	// resolveGlVertexAttrib2f glVertexAttrib2f;
+	// resolveGlVertexAttrib2fv glVertexAttrib2fv;
+	// resolveGlVertexAttrib3f glVertexAttrib3f;
+	// resolveGlVertexAttrib3fv glVertexAttrib3fv;
+	// resolveGlVertexAttrib4f glVertexAttrib4f;
+	// resolveGlVertexAttrib4fv glVertexAttrib4fv;
+	resolveGlVertexAttribPointer glVertexAttribPointer;
+	resolveGlViewport glViewport;
+};
+
+typedef struct OpenGlFunctions OpenGlFunctions;
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mspcapfileplayer.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mspcapfileplayer.h"
new file mode 100755
index 0000000..439ce68
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mspcapfileplayer.h"
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef mspcapfileplayer_h
+#define mspcapfileplayer_h
+
+#include <mediastreamer2/msfilter.h>
+
+/**
+ * This enum provides two differents outputs of the filter depending on your use case.
+ * If you want to plug this filter directly to a decoder, you may want to skip RTP header
+ * and directly get payload data using @MSPCAPFilePlayerLayerPayload. If you want to
+ * send these packet over the network, you may want to keep the RTP header using
+ * @MSPCAPFilePlayerLayerRTP.
+**/
+typedef enum _MSPCAPFilePlayerLayer {
+	MSPCAPFilePlayerLayerRTP, /* skip IP, UDP, but keeps RTP header + underlying layers */
+	MSPCAPFilePlayerLayerPayload, /* skip IP, UDP, RTP, but keeps RTP content */
+} MSPCAPFilePlayerLayer;
+
+/**
+ * This enum provides two differents way of incrementing time depending on your use case.
+ * If you want to play packets at the rate they were encoded, you should use @MSPCAPFilePlayerTimeRefRTP
+ * which contains timestamps value written by the encoder.
+ * Instead, if you want to replay a receiver-based PCAP stream as it was heard by the receiver,
+ * you should use @MSPCAPFilePlayerTimeRefCapture.
+ */
+typedef enum _MSPCAPFilePlayerTimeRef {
+	MSPCAPFilePlayerTimeRefRTP, /* use timestamps contained in RTP header to replay packets, written by the encoder */
+	MSPCAPFilePlayerTimeRefCapture, /* use time of packet capture to replay them, specially useful in case of receiver-based capture */
+} MSPCAPFilePlayerTimeRef;
+
+/*methods*/
+#define MS_PCAP_FILE_PLAYER_SET_LAYER		MS_FILTER_METHOD(MS_PCAP_FILE_PLAYER_ID,0,MSPCAPFilePlayerLayer)
+#define MS_PCAP_FILE_PLAYER_SET_TIMEREF		MS_FILTER_METHOD(MS_PCAP_FILE_PLAYER_ID,1,MSPCAPFilePlayerTimeRef)
+#define MS_PCAP_FILE_PLAYER_SET_TO_PORT		MS_FILTER_METHOD(MS_PCAP_FILE_PLAYER_ID,2,unsigned)
+#define MS_PCAP_FILE_PLAYER_SET_TS_OFFSET	MS_FILTER_METHOD(MS_PCAP_FILE_PLAYER_ID,3,uint32_t)
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msqrcodereader.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msqrcodereader.h"
new file mode 100755
index 0000000..eed87b7
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msqrcodereader.h"
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msqrcodereader_h
+#define msqrcodereader_h
+
+#include <mediastreamer2/msfilter.h>
+
+#define MS_QRCODE_READER_QRCODE_FOUND	MS_FILTER_EVENT(MS_QRCODE_READER_ID, 0, const char*)
+#define MS_QRCODE_READER_RESET_SEARCH	MS_FILTER_METHOD_NO_ARG(MS_QRCODE_READER_ID, 0)
+#define MS_QRCODE_READET_SET_DECODER_RECT	MS_FILTER_METHOD(MS_QRCODE_READER_ID, 1, MSRect)
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msqueue.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msqueue.h"
new file mode 100755
index 0000000..f435dff
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msqueue.h"
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef MSQUEUE_H
+#define MSQUEUE_H
+
+#include <ortp/str_utils.h>
+#include <mediastreamer2/mscommon.h>
+
+
+typedef struct _MSCPoint{
+	struct _MSFilter *filter;
+	int pin;
+} MSCPoint;
+
+typedef struct _MSQueue
+{
+	queue_t q;
+	MSCPoint prev;
+	MSCPoint next;
+}MSQueue;
+
+
+MS2_PUBLIC MSQueue * ms_queue_new(struct _MSFilter *f1, int pin1, struct _MSFilter *f2, int pin2 );
+
+static MS2_INLINE mblk_t *ms_queue_get(MSQueue *q){
+	return getq(&q->q);
+}
+
+static MS2_INLINE void ms_queue_put(MSQueue *q, mblk_t *m){
+	putq(&q->q,m);
+	return;
+}
+
+/**
+ * Insert mblk_t 'm' in queue 'q' just before mblk_t 'em'.
+ * If em is NULL, m is inserted at the end and becomes the last element.
+ */
+static MS2_INLINE void ms_queue_insert(MSQueue *q, mblk_t *em, mblk_t *m) {
+    insq(&q->q, em, m);
+    return;
+}
+
+static MS2_INLINE mblk_t * ms_queue_peek_last(const MSQueue *q){
+	return qlast(&q->q);
+}
+
+static MS2_INLINE mblk_t *ms_queue_peek_first(const MSQueue *q){
+	return qbegin(&q->q);
+}
+
+#define ms_queue_next(q, m) (m)->b_next
+
+static MS2_INLINE bool_t ms_queue_end(const MSQueue *q, const mblk_t *m){
+	return qend(&q->q,m);
+}
+
+static MS2_INLINE void ms_queue_remove(MSQueue *q, mblk_t *m){
+	remq(&q->q,m);
+}
+
+static MS2_INLINE bool_t ms_queue_empty(const MSQueue *q){
+	return qempty(&q->q);
+}
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*yes these functions need to be public for plugins to work*/
+
+/*init a queue on stack*/
+MS2_PUBLIC void ms_queue_init(MSQueue *q);
+
+MS2_PUBLIC void ms_queue_flush(MSQueue *q);
+
+MS2_PUBLIC void ms_queue_destroy(MSQueue *q);
+
+
+#define __mblk_set_flag(m,pos,bitval) \
+	(m)->reserved2=(m->reserved2 & ~(1<<pos)) | ((!!bitval)<<pos) 
+	
+#define mblk_set_timestamp_info(m,ts) (m)->reserved1=(ts);
+#define mblk_get_timestamp_info(m)    ((m)->reserved1)
+#define mblk_set_marker_info(m,bit)   __mblk_set_flag(m,0,bit)
+#define mblk_get_marker_info(m)	      ((m)->reserved2 & 0x1) /*bit 1*/
+
+#define mblk_set_precious_flag(m,bit)    __mblk_set_flag(m,1,bit)  /*use to prevent mirroring for video*/
+#define mblk_get_precious_flag(m)    (((m)->reserved2)>>1 & 0x1) /*bit 2 */
+
+#define mblk_set_plc_flag(m,bit)    __mblk_set_flag(m,2,bit)  /*use to mark a plc generated block*/
+#define mblk_get_plc_flag(m)    (((m)->reserved2)>>2 & 0x1) /*bit 3*/
+
+#define mblk_set_cng_flag(m,bit)    __mblk_set_flag(m,3,bit)  /*use to mark a cng generated block*/
+#define mblk_get_cng_flag(m)    (((m)->reserved2)>>3 & 0x1) /*bit 4*/
+
+#define mblk_set_user_flag(m,bit)    __mblk_set_flag(m,7,bit)  /* to be used by extensions to mediastreamer2*/
+#define mblk_get_user_flag(m)    (((m)->reserved2)>>7 & 0x1) /*bit 8*/
+
+#define mblk_set_cseq(m,value) (m)->reserved2=(m)->reserved2| ((value&0xFFFF)<<16);	
+#define mblk_get_cseq(m) ((m)->reserved2>>16)
+
+#define HAVE_ms_bufferizer_fill_current_metas
+	
+struct _MSBufferizer{
+	queue_t q;
+	size_t size;
+};
+
+typedef struct _MSBufferizer MSBufferizer;
+
+/*allocates and initialize */
+MS2_PUBLIC MSBufferizer * ms_bufferizer_new(void);
+
+/*initialize in memory */
+MS2_PUBLIC void ms_bufferizer_init(MSBufferizer *obj);
+
+MS2_PUBLIC void ms_bufferizer_put(MSBufferizer *obj, mblk_t *m);
+
+/* put every mblk_t from q, into the bufferizer */
+MS2_PUBLIC void ms_bufferizer_put_from_queue(MSBufferizer *obj, MSQueue *q);
+
+/*read bytes from bufferizer object*/
+MS2_PUBLIC size_t ms_bufferizer_read(MSBufferizer *obj, uint8_t *data, size_t datalen);
+
+/*obtain current meta-information of the last read bytes (if any) and copy them into 'm'*/
+MS2_PUBLIC void ms_bufferizer_fill_current_metas(MSBufferizer *obj, mblk_t *m);
+
+/* returns the number of bytes available in the bufferizer*/
+static MS2_INLINE size_t ms_bufferizer_get_avail(MSBufferizer *obj){
+	return obj->size;
+}
+
+MS2_PUBLIC void ms_bufferizer_skip_bytes(MSBufferizer *obj, int bytes);
+
+/* purge all data pending in the bufferizer */
+MS2_PUBLIC void ms_bufferizer_flush(MSBufferizer *obj);
+
+MS2_PUBLIC void ms_bufferizer_uninit(MSBufferizer *obj);
+
+MS2_PUBLIC void ms_bufferizer_destroy(MSBufferizer *obj);
+
+
+struct _MSFlowControlledBufferizer {
+	MSBufferizer base;
+	struct _MSFilter *filter;
+	uint64_t flow_control_time;
+	uint32_t flow_control_interval_ms;
+	uint32_t max_size_ms;
+	uint32_t granularity_ms;
+	uint32_t min_size_ms_during_interval;
+	int samplerate;
+	int nchannels;
+};
+
+typedef struct _MSFlowControlledBufferizer MSFlowControlledBufferizer;
+
+MS2_PUBLIC MSFlowControlledBufferizer * ms_flow_controlled_bufferizer_new(struct _MSFilter *f, int samplerate, int nchannels);
+
+MS2_PUBLIC void ms_flow_controlled_bufferizer_init(MSFlowControlledBufferizer *obj, struct _MSFilter *f, int samplerate, int nchannels);
+
+MS2_PUBLIC void ms_flow_controlled_bufferizer_set_max_size_ms(MSFlowControlledBufferizer *obj, uint32_t ms);
+
+MS2_PUBLIC void ms_flow_controlled_bufferizer_set_granularity_ms(MSFlowControlledBufferizer *obj, uint32_t ms);
+
+MS2_PUBLIC void ms_flow_controlled_bufferizer_set_flow_control_interval_ms(MSFlowControlledBufferizer *obj, uint32_t ms);
+
+MS2_PUBLIC void ms_flow_controlled_bufferizer_set_samplerate(MSFlowControlledBufferizer *obj, int samplerate);
+
+MS2_PUBLIC void ms_flow_controlled_bufferizer_set_nchannels(MSFlowControlledBufferizer *obj, int nchannels);
+
+MS2_PUBLIC void ms_flow_controlled_bufferizer_put(MSFlowControlledBufferizer *obj, mblk_t *m);
+
+MS2_PUBLIC void ms_flow_controlled_bufferizer_put_from_queue(MSFlowControlledBufferizer *obj, MSQueue *q);
+
+#define ms_flow_controlled_bufferizer_read(obj, data, datalen) ms_bufferizer_read((MSBufferizer *)(obj), data, datalen)
+
+#define ms_flow_controlled_bufferizer_fill_current_metas(obj, m) ms_bufferizer_fill_current_metas((MSBufferizer *)(obj), m)
+
+#define ms_flow_controlled_bufferizer_get_avail(obj) ms_bufferizer_get_avail((MSBufferizer *)(obj))
+
+#define ms_flow_controlled_bufferizer_skip_bytes(obj, bytes) ms_bufferizer_skip_bytes((MSBufferizer *)(obj), bytes)
+
+#define ms_flow_controlled_bufferizer_flush(obj) ms_bufferizer_flush((MSBufferizer *)(obj))
+
+#define ms_flow_controlled_bufferizer_uninit(obj) ms_bufferizer_uninit((MSBufferizer *)(obj))
+
+#define ms_flow_controlled_bufferizer_destroy(obj) ms_bufferizer_destroy((MSBufferizer *)(obj))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msrtp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msrtp.h"
new file mode 100755
index 0000000..5090cbd
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msrtp.h"
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef msrtp_hh
+#define msrtp_hh
+
+#include <mediastreamer2/msfilter.h>
+#include <mediastreamer2/msvaddtx.h>
+#include <ortp/ortp.h>
+
+#define MS_RTP_RECV_SET_SESSION			MS_FILTER_METHOD(MS_RTP_RECV_ID,0,RtpSession*)
+
+#define MS_RTP_RECV_RESET_JITTER_BUFFER		MS_FILTER_METHOD_NO_ARG(MS_RTP_RECV_ID,1)
+
+#define MS_RTP_RECV_GENERIC_CN_RECEIVED		MS_FILTER_EVENT(MS_RTP_RECV_ID,0, MSCngData)
+
+
+#define MS_RTP_SEND_SET_SESSION			MS_FILTER_METHOD(MS_RTP_SEND_ID,0,RtpSession*)
+
+#define MS_RTP_SEND_SEND_DTMF			MS_FILTER_METHOD(MS_RTP_SEND_ID,1,const char)
+
+#define MS_RTP_SEND_SET_DTMF_DURATION		MS_FILTER_METHOD(MS_RTP_SEND_ID,2,int)
+
+#define MS_RTP_SEND_MUTE			MS_FILTER_METHOD_NO_ARG(MS_RTP_SEND_ID,3)
+
+#define MS_RTP_SEND_UNMUTE			MS_FILTER_METHOD_NO_ARG(MS_RTP_SEND_ID,4)
+
+#define MS_RTP_SEND_SET_RELAY_SESSION_ID	MS_FILTER_METHOD(MS_RTP_SEND_ID,5,const char *)
+
+#define MS_RTP_SEND_SEND_GENERIC_CN		MS_FILTER_METHOD(MS_RTP_SEND_ID,6, const MSCngData)
+
+#define MS_RTP_SEND_ENABLE_STUN			MS_FILTER_METHOD(MS_RTP_SEND_ID, 7, bool_t)
+
+#define MS_RTP_SEND_ENABLE_TS_ADJUSTMENT	MS_FILTER_METHOD(MS_RTP_SEND_ID, 8, bool_t)
+
+
+
+
+extern MSFilterDesc ms_rtp_send_desc;
+extern MSFilterDesc ms_rtp_recv_desc;
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msrtt4103.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msrtt4103.h"
new file mode 100755
index 0000000..bb06e09
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msrtt4103.h"
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msrtt4103_h
+#define msrtt4103_h
+
+#include <mediastreamer2/msfilter.h>
+
+#define TS_FLAG_NOTFIRST 0x01
+#define TS_FLAG_NOCALLBACK 0x02
+
+#define TS_OUTBUF_SIZE 1024
+#define TS_REDGEN 2
+#define TS_NUMBER_OF_OUTBUF TS_REDGEN + 1
+#define TS_INBUF_SIZE TS_OUTBUF_SIZE * TS_NUMBER_OF_OUTBUF
+#define TS_KEEP_ALIVE_INTERVAL 25000 //10000
+#define TS_SEND_INTERVAL 299
+
+#define MS_RTT_4103_SOURCE_SET_T140_PAYLOAD_TYPE_NUMBER MS_FILTER_METHOD(MS_RTT_4103_SOURCE_ID, 0, int)
+#define MS_RTT_4103_SINK_SET_T140_PAYLOAD_TYPE_NUMBER MS_FILTER_METHOD(MS_RTT_4103_SINK_ID, 0, int)
+#define MS_RTT_4103_SOURCE_SET_RED_PAYLOAD_TYPE_NUMBER MS_FILTER_METHOD(MS_RTT_4103_SOURCE_ID, 1, int)
+#define MS_RTT_4103_SINK_SET_RED_PAYLOAD_TYPE_NUMBER MS_FILTER_METHOD(MS_RTT_4103_SINK_ID, 1, int)
+#define MS_RTT_4103_SOURCE_PUT_CHAR32 MS_FILTER_METHOD(MS_RTT_4103_SOURCE_ID, 2, uint32_t)
+
+typedef struct _RealtimeTextReceivedCharacter {
+	uint32_t character;
+} RealtimeTextReceivedCharacter;
+
+#define MS_RTT_4103_RECEIVED_CHAR MS_FILTER_EVENT(MS_RTT_4103_SINK_ID, 0, RealtimeTextReceivedCharacter)
+
+#endif
\ No newline at end of file
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mssndcard.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mssndcard.h"
new file mode 100755
index 0000000..1942da9
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mssndcard.h"
@@ -0,0 +1,580 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef sndcard_h
+#define sndcard_h
+
+#include <mediastreamer2/mscommon.h>
+#include <mediastreamer2/msfactory.h>
+/**
+ * @file mssndcard.h
+ * @brief mediastreamer2 mssndcard.h include file
+ *
+ * This file provide the API needed to manage
+ * soundcard filters.
+ *
+ */
+
+/**
+ * @addtogroup mediastreamer2_soundcard
+ * @{
+ */
+
+struct _MSSndCardManager{
+	MSFactory* factory;
+	MSList *cards;
+	MSList *descs;
+};
+
+/**
+ * Structure for sound card manager object.
+ * @var MSSndCardManager
+ */
+typedef struct _MSSndCardManager MSSndCardManager;
+
+enum _MSSndCardMixerElem{
+	MS_SND_CARD_MASTER,
+	MS_SND_CARD_PLAYBACK,
+	MS_SND_CARD_CAPTURE
+};
+
+/**
+ * Structure for sound card mixer values.
+ * @var MSSndCardMixerElem
+ */
+typedef enum _MSSndCardMixerElem MSSndCardMixerElem;
+
+enum _MSSndCardCapture {
+	MS_SND_CARD_MIC,
+	MS_SND_CARD_LINE
+};
+
+/**
+ * Structure for sound card capture source values.
+ * @var MSSndCardCapture
+ */
+typedef enum _MSSndCardCapture MSSndCardCapture;
+
+enum _MSSndCardControlElem {
+	MS_SND_CARD_MASTER_MUTE,
+	MS_SND_CARD_PLAYBACK_MUTE,
+	MS_SND_CARD_CAPTURE_MUTE
+};
+
+/**
+ * Structure for sound card mixer values.
+ * @var MSSndCardControlElem
+ */
+typedef enum _MSSndCardControlElem MSSndCardControlElem;
+
+struct _MSSndCard;
+
+typedef void (*MSSndCardDetectFunc)(MSSndCardManager *obj);
+typedef void (*MSSndCardInitFunc)(struct _MSSndCard *obj);
+typedef void (*MSSndCardUninitFunc)(struct _MSSndCard *obj);
+typedef void (*MSSndCardSetLevelFunc)(struct _MSSndCard *obj, MSSndCardMixerElem e, int percent);
+typedef void (*MSSndCardSetCaptureFunc)(struct _MSSndCard *obj, MSSndCardCapture e);
+typedef int (*MSSndCardGetLevelFunc)(struct _MSSndCard *obj, MSSndCardMixerElem e);
+typedef int (*MSSndCardSetControlFunc)(struct _MSSndCard *obj, MSSndCardControlElem e, int val);
+typedef int (*MSSndCardGetControlFunc)(struct _MSSndCard *obj, MSSndCardControlElem e);
+typedef struct _MSFilter * (*MSSndCardCreateReaderFunc)(struct _MSSndCard *obj);
+typedef struct _MSFilter * (*MSSndCardCreateWriterFunc)(struct _MSSndCard *obj);
+typedef struct _MSSndCard * (*MSSndCardDuplicateFunc)(struct _MSSndCard *obj);
+typedef void (*MSSndCardSetUsageHintFunc)(struct _MSSndCard *obj, bool_t is_going_to_be_used);
+typedef void (*MSSndCardUnloadFunc)(MSSndCardManager *obj);
+
+
+struct _MSSndCardDesc{
+	const char *driver_type;
+	MSSndCardDetectFunc detect;
+	MSSndCardInitFunc init;
+	MSSndCardSetLevelFunc set_level;
+	MSSndCardGetLevelFunc get_level;
+	MSSndCardSetCaptureFunc set_capture;
+	MSSndCardSetControlFunc set_control;
+	MSSndCardGetControlFunc get_control;
+	MSSndCardCreateReaderFunc create_reader;
+	MSSndCardCreateWriterFunc create_writer;
+	MSSndCardUninitFunc uninit;
+	MSSndCardDuplicateFunc duplicate;
+	MSSndCardUnloadFunc unload;
+	MSSndCardSetUsageHintFunc usage_hint;
+};
+
+/**
+ * Structure for sound card description object.
+ * @var MSSndCardDesc
+ */
+typedef struct _MSSndCardDesc MSSndCardDesc;
+
+/**
+ * Structure for sound card object.
+ * @var MSSndCard
+ */
+typedef struct _MSSndCard MSSndCard;
+
+enum _MSSndCardStreamType{
+	MS_SND_CARD_STREAM_VOICE,
+	MS_SND_CARD_STREAM_RING,
+	MS_SND_CARD_STREAM_MEDIA
+};
+
+/**
+ * Structure for sound card stream type.
+ */
+typedef enum _MSSndCardStreamType MSSndCardStreamType;
+
+#define MS_SND_CARD_CAP_DISABLED (0) /**<This soundcard is disabled.*/
+#define MS_SND_CARD_CAP_CAPTURE (1) /**<This sound card can capture sound */
+#define MS_SND_CARD_CAP_PLAYBACK (1<<1) /**<This sound card can playback sound */
+#define MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER (1<<2) /**<This sound card has built-in echo cancellation*/
+#define MS_SND_CARD_CAP_IS_SLOW (1<<3) /**<This sound card is very slow to start*/
+
+struct _MSSndCard{
+	MSSndCardDesc *desc;
+	MSSndCardManager* sndcardmanager;
+	char *name;
+	char *id;
+	unsigned int capabilities;
+	void *data;
+	int preferred_sample_rate;
+	int latency;
+	MSSndCardStreamType streamType;
+};
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * @defgroup mediastreamer2_soundcardmanager Sound Card Manager API
+ * @ingroup mediastreamer2_soundcard
+ * @{
+ */
+
+/**
+ * Retreive a sound card manager object.
+ *
+ * Returns: MSSndCardManager if successfull, NULL otherwise.
+ * @deprecated use ms_factory_get_snd_card_manager()
+ */
+MS2_PUBLIC MS2_DEPRECATED MSSndCardManager * ms_snd_card_manager_get(void);
+
+/**
+ * Retrieve a factory from a sound card object.
+ * @param c MSSndCard object.
+ * Returns: MSFactory pointer.
+ */
+MS2_PUBLIC MSFactory * ms_snd_card_get_factory(MSSndCard * c);
+
+/**
+ * Create a sound card manager object.
+ * You usually do not need this function, instead get the sound card manager from a factory
+ * with ms_factory_get_snd_card_manager().
+ */
+MS2_PUBLIC MSSndCardManager * ms_snd_card_manager_new(void);
+
+/**
+ * Destroy a sound card manager object.
+ * You usually do not need this function, the ms_factory_destroy() doing this job for you.
+ */
+MS2_PUBLIC void ms_snd_card_manager_destroy(MSSndCardManager* sndcardmanager);
+
+/**
+ * Retreive a sound card object based on its name.
+ *
+ * @param m    A sound card manager containing sound cards.
+ * @param id   A name for card to search.
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_card(MSSndCardManager *m, const char *id);
+
+/**
+ * Retreive a playback capable sound card object based on its name.
+ *
+ * @param m    A sound card manager containing sound cards.
+ * @param id   A name for card to search.
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_playback_card(MSSndCardManager *m, const char *id);
+
+/**
+ * Retreive a capture capable sound card object based on its name.
+ *
+ * @param m    A sound card manager containing sound cards.
+ * @param id   A name for card to search.
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_capture_card(MSSndCardManager *m, const char *id);
+
+/**
+ * Retreive the default sound card object.
+ *
+ * @param m    A sound card manager containing sound cards.
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_default_card(MSSndCardManager *m);
+
+/**
+ * Retreive the default capture sound card object.
+ *
+ * @param m    A sound card manager containing sound cards.
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_default_capture_card(MSSndCardManager *m);
+
+/**
+ * Retreive the default playback sound card object.
+ *
+ * @param m    A sound card manager containing sound cards.
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_default_playback_card(MSSndCardManager *m);
+
+/**
+ * Retreive the list of sound card objects.
+ *
+ * @param m    A sound card manager containing sound cards.
+ *
+ * Returns: MSList of cards if successfull, NULL otherwise.
+ */
+MS2_PUBLIC const MSList * ms_snd_card_manager_get_list(MSSndCardManager *m);
+
+/**
+ * Add a sound card object in a sound card manager's list.
+ *
+ * @param m    A sound card manager containing sound cards.
+ * @param c    A sound card object.
+ *
+ */
+MS2_PUBLIC void ms_snd_card_manager_add_card(MSSndCardManager *m, MSSndCard *c);
+
+/**
+ * Prepend a sound card object in a sound card manager's list.
+ *
+ * @param m    A sound card manager containing sound cards.
+ * @param c    A sound card object.
+ *
+ */
+MS2_PUBLIC void ms_snd_card_manager_prepend_card(MSSndCardManager *m, MSSndCard *c);
+	
+/**
+ * Set the sound card manager of a sound card.
+ *
+ * @param m    A sound card manager containing sound cards.
+ * @param c    A sound card object.
+ *
+ */
+MS2_PUBLIC void ms_snd_card_set_manager(MSSndCardManager*m, MSSndCard *c);
+
+/**
+ * Prepend a list of sound card object to the sound card manager's list.
+ * @param[in] m A sound card manager containing sound cards.
+ * @param[in] l A list of sound card objects to be prepended to the sound card manager's list.
+ */
+MS2_PUBLIC void ms_snd_card_manager_prepend_cards(MSSndCardManager *m, MSList *l);
+
+/**
+ * Register a sound card description in a sound card manager.
+ *
+ * @param m      A sound card manager containing sound cards.
+ * @param desc   A sound card description object.
+ *
+ */
+MS2_PUBLIC void ms_snd_card_manager_register_desc(MSSndCardManager *m, MSSndCardDesc *desc);
+
+/**
+ * Ask all registered MSSndCardDesc to re-detect their soundcards.
+ * @param m The sound card manager.
+**/
+MS2_PUBLIC void ms_snd_card_manager_reload(MSSndCardManager *m);
+
+/* This function is available for testing only, this should not be used in a real application! */
+MS2_PUBLIC void ms_snd_card_manager_bypass_soundcard_detection(bool_t value);
+
+/** @} */
+
+/**
+ * @defgroup mediastreamer2_soundcardfilter Sound Card Filter API
+ * @ingroup mediastreamer2_soundcard
+ * @{
+ */
+
+/**
+ * Create an INPUT filter based on the selected sound card.
+ *
+ * @param obj      A sound card object.
+ *
+ * Returns: A MSFilter if successfull, NULL otherwise.
+ */
+MS2_PUBLIC struct _MSFilter * ms_snd_card_create_reader(MSSndCard *obj);
+
+/**
+ * Create an OUPUT filter based on the selected sound card.
+ *
+ * @param obj      A sound card object.
+ *
+ * Returns: A MSFilter if successfull, NULL otherwise.
+ */
+MS2_PUBLIC struct _MSFilter * ms_snd_card_create_writer(MSSndCard *obj);
+
+/**
+ * Create a new sound card object.
+ *
+ * @param desc   A sound card description object.
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSSndCard * ms_snd_card_new(MSSndCardDesc *desc);
+
+/**
+ * Create a new sound card object.
+ *
+ * @param desc   A sound card description object.
+ * @param name The card name
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+	
+MS2_PUBLIC MSSndCard * ms_snd_card_new_with_name(MSSndCardDesc *desc,const char* name);
+/**
+ * Destroy sound card object.
+ *
+ * @param obj   A MSSndCard object.
+ */
+MS2_PUBLIC void ms_snd_card_destroy(MSSndCard *obj);
+
+/**
+ * Duplicate a sound card object.
+ *
+ * This helps to open several time a sound card.
+ *
+ * @param card   A sound card object.
+ *
+ * Returns: MSSndCard if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSSndCard * ms_snd_card_dup(MSSndCard *card);
+
+/**
+ * Retreive a sound card's driver type string.
+ *
+ * Internal driver types are either: "OSS, ALSA, WINSND, PASND, CA"
+ *
+ * @param obj   A sound card object.
+ *
+ * Returns: a string if successfull, NULL otherwise.
+ */
+MS2_PUBLIC const char *ms_snd_card_get_driver_type(const MSSndCard *obj);
+
+/**
+ * Retreive a sound card's name.
+ *
+ * @param obj   A sound card object.
+ *
+ * Returns: a string if successfull, NULL otherwise.
+ */
+MS2_PUBLIC const char *ms_snd_card_get_name(const MSSndCard *obj);
+
+/**
+ * Retreive sound card's name ($driver_type: $name).
+ *
+ * @param obj    A sound card object.
+ *
+ * Returns: A string if successfull, NULL otherwise.
+ */
+MS2_PUBLIC const char *ms_snd_card_get_string_id(MSSndCard *obj);
+
+
+/**
+ * Retreive sound card's capabilities.
+ *
+ * <PRE>
+ *   MS_SND_CARD_CAP_CAPTURE
+ *   MS_SND_CARD_CAP_PLAYBACK
+ *   MS_SND_CARD_CAP_CAPTURE|MS_SND_CARD_CAP_PLAYBACK
+ *   MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER
+ * </PRE>
+ *
+ * @param obj    A sound card object.
+ *
+ * Returns: A unsigned int if successfull, 0 otherwise.
+ */
+MS2_PUBLIC unsigned int ms_snd_card_get_capabilities(const MSSndCard *obj);
+
+/**
+ * Returns the sound card minimal latency (playback+record), in milliseconds.
+ * This value is to be used by the software echo cancellers to know where to search for the echo (optimization).
+ * Typically, an echo shall not be found before the value returned by this function.
+ * If this value is not known, then it should return 0.
+ * @param obj    A sound card object.
+**/
+MS2_PUBLIC int ms_snd_card_get_minimal_latency(MSSndCard *obj);
+
+/**
+ * Set some mixer level value.
+ *
+ * <PRE>
+ *   MS_SND_CARD_MASTER,
+ *   MS_SND_CARD_PLAYBACK,
+ *   MS_SND_CARD_CAPTURE
+ * </PRE>
+ * Note: not implemented on all sound card filters.
+ *
+ * @param obj      A sound card object.
+ * @param e        A sound card mixer object.
+ * @param percent  A volume level.
+ *
+ */
+MS2_PUBLIC void ms_snd_card_set_level(MSSndCard *obj, MSSndCardMixerElem e, int percent);
+
+/**
+ * Get some mixer level value.
+ *
+ * <PRE>
+ *   MS_SND_CARD_MASTER,
+ *   MS_SND_CARD_PLAYBACK,
+ *   MS_SND_CARD_CAPTURE
+ * </PRE>
+ * Note: not implemented on all sound card filters.
+ *
+ * @param obj      A sound card object.
+ * @param e        A sound card mixer object.
+ *
+ * Returns: A int if successfull, <0 otherwise.
+ */
+MS2_PUBLIC int ms_snd_card_get_level(MSSndCard *obj, MSSndCardMixerElem e);
+
+/**
+ * Set some source for capture.
+ *
+ * <PRE>
+ *   MS_SND_CARD_MIC,
+ *   MS_SND_CARD_LINE
+ * </PRE>
+ * Note: not implemented on all sound card filters.
+ *
+ * @param obj      A sound card object.
+ * @param c        A sound card capture value.
+ *
+ * Returns: A int if successfull, 0 otherwise.
+ */
+MS2_PUBLIC void ms_snd_card_set_capture(MSSndCard *obj, MSSndCardCapture c);
+
+/**
+ * Set some mixer control.
+ *
+ * <PRE>
+ *   MS_SND_CARD_MASTER_MUTE, -> 0: unmute, 1: mute
+ *   MS_SND_CARD_PLAYBACK_MUTE, -> 0: unmute, 1: mute
+ *   MS_SND_CARD_CAPTURE_MUTE -> 0: unmute, 1: mute
+ * </PRE>
+ * Note: not implemented on all sound card filters.
+ *
+ * @param obj      A sound card object.
+ * @param e        A sound card control object.
+ * @param val  A value for control.
+ *
+ * Returns: 0 if successfull, <0 otherwise.
+ */
+MS2_PUBLIC int ms_snd_card_set_control(MSSndCard *obj, MSSndCardControlElem e, int val);
+
+/**
+ * Get some mixer control.
+ *
+ * <PRE>
+ *   MS_SND_CARD_MASTER_MUTE, -> return 0: unmute, 1: mute
+ *   MS_SND_CARD_PLAYBACK_MUTE, -> return 0: unmute, 1: mute
+ *   MS_SND_CARD_CAPTURE_MUTE -> return 0: unmute, 1: mute
+ * </PRE>
+ * Note: not implemented on all sound card filters.
+ *
+ * @param obj      A sound card object.
+ * @param e        A sound card mixer object.
+ *
+ * Returns: A int if successfull, <0 otherwise.
+ */
+MS2_PUBLIC int ms_snd_card_get_control(MSSndCard *obj, MSSndCardControlElem e);
+
+/**
+ * Get preferred sample rate
+ *
+ * @param obj      A sound card object.
+ *
+ * Returns: return sample rate in khz
+ */
+MS2_PUBLIC int ms_snd_card_get_preferred_sample_rate(const MSSndCard *obj);
+
+/**
+ * set preferred sample rate. The underlying card will try to avoid any resampling for this samplerate.
+ *
+ * @param obj      A sound card object.
+ * @param rate     sampling rate. 
+ *
+ * Returns:  0 if successfull, <0 otherwise.
+ */
+MS2_PUBLIC int ms_snd_card_set_preferred_sample_rate(MSSndCard *obj,int rate);
+
+/**
+ * Enable application to tell that the soundcard is going to be used or will cease to be used.
+ * This is recommended for cards which are known to be slow (see flag MS_SND_CARD_CAP_IS_SLOW ).
+**/
+MS2_PUBLIC void ms_snd_card_set_usage_hint(MSSndCard *obj, bool_t is_going_to_be_used);
+
+/**
+ * Sets the stream type for this soundcard, default is VOICE
+**/
+MS2_PUBLIC void ms_snd_card_set_stream_type(MSSndCard *obj, MSSndCardStreamType type);
+
+/**
+ * Gets the stream type for this soundcard, default is VOICE
+**/
+MS2_PUBLIC MSSndCardStreamType ms_snd_card_get_stream_type(MSSndCard *obj);
+
+/**
+ * Create a alsa card with user supplied pcm name and mixer name.
+ * @param pcmdev The pcm device name following alsa conventions (ex: plughw:0)
+ * @param mixdev The mixer device name following alsa conventions.
+ *
+ * Returns: a MSSndCard object, NULL if alsa support is not available.
+ */
+MS2_PUBLIC MSSndCard * ms_alsa_card_new_custom(const char *pcmdev, const char *mixdev);
+
+
+/**
+ * Use supplied sample rate to open alsa devices (forced rate).
+ * Has no interest except workarouding driver bugs.
+ * Use -1 to revert to normal behavior.
+**/
+MS2_PUBLIC void ms_alsa_card_set_forced_sample_rate(int samplerate);
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mstee.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mstee.h"
new file mode 100755
index 0000000..2658e01
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mstee.h"
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef mstee_h
+#define mstee_h
+
+#include <mediastreamer2/msfilter.h>
+
+/*mute/unmute some outputs of the MSTee */
+#define MS_TEE_UNMUTE	MS_FILTER_METHOD(MS_TEE_ID,0,int)
+#define MS_TEE_MUTE	MS_FILTER_METHOD(MS_TEE_ID,1,int)
+
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msticker.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msticker.h"
new file mode 100755
index 0000000..0485987
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msticker.h"
@@ -0,0 +1,304 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef MS_TICKER_H
+#define MS_TICKER_H
+
+#include <mediastreamer2/msfilter.h>
+
+/**
+ * @file msticker.h
+ * @brief mediastreamer2 msticker.h include file
+ *
+ * This file provide the API needed to create, start
+ * and stop a graph.
+ *
+ */
+
+/**
+ * @addtogroup mediastreamer2_ticker
+ * @{
+ */
+
+
+/**
+ * Function pointer for method getting time in miliseconds from an external source.
+ * @var MSTickerTimeFunc
+ */
+typedef uint64_t (*MSTickerTimeFunc)(void *);
+
+/**
+ * Function pointer for method waiting next tick from an external source.
+ * @var MSTickerTickFunc
+ * It shall return the number of late milliseconds, if this value is known.
+ */
+typedef int (*MSTickerTickFunc)(void *, uint64_t ticker_virtual_time);
+
+/**
+ * Enum for ticker priority
+**/
+enum _MSTickerPrio{
+	MS_TICKER_PRIO_NORMAL, /**<the default OS priority for threads*/
+	MS_TICKER_PRIO_HIGH, /**<Increased priority: done by setpriority() or sched_setschedparams() with SCHED_RR on linux/MacOS*/
+	MS_TICKER_PRIO_REALTIME /**<Topmost priority, running SCHED_FIFO on linux */
+};
+
+typedef enum _MSTickerPrio MSTickerPrio;
+
+struct _MSTickerLateEvent{
+	int lateMs; /**< late at the time of the last event, in milliseconds */
+	uint64_t time; /**< time of late event, in milliseconds */
+	int current_late_ms; /**< late at the time of the last tick, in milliseconds */
+};
+
+typedef struct _MSTickerLateEvent MSTickerLateEvent;
+
+struct _MSTicker
+{
+	ms_mutex_t lock; /*main lock protecting the filter execution list */
+	ms_cond_t cond;
+	MSList *execution_list;     /* the list of source filters to be executed.*/
+	MSList *task_list; /* list of tasks (see ms_filter_postpone_task())*/
+	ms_thread_t thread;   /* the thread ressource*/
+	int interval; /* in miliseconds*/
+	int exec_id;
+	uint32_t ticks;
+	uint64_t time;	/* a time since the start of the ticker expressed in milisec*/
+	uint64_t orig; /* a relative time to take in account difference between time base given by consecutive get_cur_time_ptr() functions.*/
+	MSTickerTimeFunc get_cur_time_ptr;
+	void *get_cur_time_data;
+	ms_mutex_t cur_time_lock; /*mutex protecting the get_cur_time_ptr/get_cur_time_data which can be changed at any time*/
+	char *name;
+	double av_load;	/*average load of the ticker */
+	MSTickerPrio prio;
+	MSTickerTickFunc wait_next_tick;
+	void *wait_next_tick_data;
+	MSTickerLateEvent late_event;
+	unsigned long thread_id;
+	bool_t run;       /* flag to indicate whether the ticker must be run or not */
+};
+
+/**
+ * Structure for ticker object.
+ * @var MSTicker
+ */
+typedef struct _MSTicker MSTicker;
+
+
+struct _MSTickerParams{
+	MSTickerPrio prio;
+	const char *name;
+};
+
+typedef struct _MSTickerParams MSTickerParams;
+
+
+struct _MSTickerSynchronizer
+{
+	uint64_t offset; /**<the default offset of ticker*/
+	double av_skew; /**< mean skew */
+	unsigned int external_time_count; /**< number of times ms_ticker_synchronizer_set_external_time() is called */
+	uint64_t current_nsamples; /**< The last number of samples read notified with ms_ticker_synchronizer_update*/
+};
+
+/**
+ * Structure for ticker synchronizer object.
+ * @var MSTickerSynchronizer
+ */
+typedef struct _MSTickerSynchronizer MSTickerSynchronizer;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/**
+ * Create a ticker that will be used to start
+ * and stop a graph.
+ *
+ * Returns: MSTicker * if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSTicker *ms_ticker_new(void);
+
+/**
+ * Create a ticker that will be used to start
+ * and stop a graph.
+ *
+ * Returns: MSTicker * if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSTicker *ms_ticker_new_with_params(const MSTickerParams *params);
+	
+/**
+ * Set a name to the ticker (used for logging)
+**/
+MS2_PUBLIC void ms_ticker_set_name(MSTicker *ticker, const char *name);
+
+/**
+ * Deprecated: Set priority to the ticker
+**/
+MS2_PUBLIC void ms_ticker_set_priority(MSTicker *ticker, MSTickerPrio prio);
+	
+/**
+ * Attach a chain of filters to a ticker.
+ * The processing chain will be executed until ms_ticker_detach
+ * will be called.
+ *
+ * @param ticker  A #MSTicker object.
+ * @param f       A #MSFilter object.
+ *
+ * Returns: 0 if successfull, -1 otherwise.
+ */
+MS2_PUBLIC int ms_ticker_attach(MSTicker *ticker,MSFilter *f);
+
+/**
+ * Attach a chain of filters to a ticker.
+ * The processing chain will be executed until ms_ticker_detach
+ * will be called.
+ * This variadic can be used to attach multiple chains in a single call. The argument list MUST be NULL terminated.
+ *
+ * @param ticker  A #MSTicker object.
+ * @param f       A #MSFilter object.
+ *
+ * Returns: 0 if successfull, -1 otherwise.
+ */
+MS2_PUBLIC int ms_ticker_attach_multiple(MSTicker *ticker,MSFilter *f,...);
+
+/**
+ * Dettach a chain of filters to a ticker.
+ * The processing chain will no more be executed.
+ *
+ * @param ticker  A #MSTicker object.
+ * @param f  A #MSFilter object.
+ *
+ *
+ * Returns: 0 if successfull, -1 otherwise.
+ */
+MS2_PUBLIC int ms_ticker_detach(MSTicker *ticker,MSFilter *f);
+
+/**
+ * Destroy a ticker.
+ *
+ * @param ticker  A #MSTicker object.
+ *
+ */
+MS2_PUBLIC void ms_ticker_destroy(MSTicker *ticker);
+
+/**
+ * Override MSTicker's time function.
+ * This can be used to control the ticker from an external time provider, for example the 
+ * clock of a sound card.
+ * WARNING: this must not be used in conjunction with ms_ticker_set_tick_func().
+ *
+ * @param ticker  A #MSTicker object.
+ * @param func    A replacement method for calculating "current time"
+ * @param user_data Any pointer to user private data.
+ */
+MS2_PUBLIC void ms_ticker_set_time_func(MSTicker *ticker, MSTickerTimeFunc func, void *user_data);
+
+/**
+ * Override MSTicker's ticking function.
+ * This can be used to control the ticker from an external ticking source, for example an interrupt, an event on a file descriptor, etc.
+ * WARNING: this must not be used in conjunction with ms_ticker_set_time_func().
+ *
+ * @param ticker  A #MSTicker object.
+ * @param func    A replacement method waiting the next tick.
+ * @param user_data Any pointer to user private data.
+ */
+MS2_PUBLIC void ms_ticker_set_tick_func(MSTicker *ticker, MSTickerTickFunc func, void *user_data);
+
+/**
+ * Print on stdout all filters of a ticker. (INTERNAL: DO NOT USE)
+ *
+ * @param ticker  A #MSTicker object.
+ */
+MS2_PUBLIC void ms_ticker_print_graphs(MSTicker *ticker);
+
+/**
+ * Get the average load of the ticker.
+ * It is expressed as the ratio between real time spent in processing all graphs for a tick divided by the
+ * tick interval (default is 10 ms).
+ * This value is averaged over several ticks to get consistent and useful value.
+ * A load greater than 100% clearly means that the ticker is over loaded and runs late.
+**/
+MS2_PUBLIC float ms_ticker_get_average_load(MSTicker *ticker);
+
+/**
+ * Get last late tick event description.
+ * @param ticker the MSTicker
+ * @param ev a MSTickerLaterEvent structure that will be filled in return by the ticker.
+**/
+MS2_PUBLIC void ms_ticker_get_last_late_tick(MSTicker *ticker, MSTickerLateEvent *ev);
+
+/**
+ * Round a time in milliseconds to the internal ticker interval.
+ * @param[in] ms The time in milliseconds to round
+ * @return The rounded time in milliseconds
+ */
+MS2_PUBLIC uint64_t ms_ticker_round(uint64_t ms);
+
+/**
+ * Set the MSTickerSynchronizer for a MSTicker.
+ * @param ticker A MSTicker object to synchronize
+ * @param ts A MSTickerSynchronizer to use for synchronization of the ticker
+ */
+MS2_PUBLIC void ms_ticker_set_synchronizer(MSTicker *ticker, MSTickerSynchronizer *ts);
+
+/**
+ * Create a ticker synchronizer.
+ * @return MSTickerSynchronizer object if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSTickerSynchronizer* ms_ticker_synchronizer_new(void);
+
+/**
+ * Set the current external time.
+ * @param ts  A #MSTickerSynchronizer object.
+ * @param time  A #MSTimeSpec object.
+ * @return Average skew.
+ */
+MS2_PUBLIC double ms_ticker_synchronizer_set_external_time(MSTickerSynchronizer *ts, const MSTimeSpec *time);
+
+/**
+ * Update the ticker synchronizer state
+ * @param ts A MSTickerSynchronizer object
+ * @param nb_samples The number of samples since the processing started
+ * @param sample_rate The sample rate of the stream
+ */
+MS2_PUBLIC double ms_ticker_synchronizer_update(MSTickerSynchronizer *ts, uint64_t nb_samples, unsigned int sample_rate);
+
+/**
+ * Get the corrected current time following the set external times.
+ * @param ts  A #MSTickerSynchronizer object.
+ * @return A corrected current time.
+ */
+MS2_PUBLIC uint64_t ms_ticker_synchronizer_get_corrected_time(MSTickerSynchronizer* ts);
+
+/**
+ * Destroy a ticker synchronizer.
+ * @param ts  A #MSTickerSynchronizer object.
+ */
+MS2_PUBLIC void ms_ticker_synchronizer_destroy(MSTickerSynchronizer* ts);
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mstonedetector.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mstonedetector.h"
new file mode 100755
index 0000000..d1ecd63
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mstonedetector.h"
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef mstonedetector_h
+#define mstonedetector_h
+
+#include <mediastreamer2/msfilter.h>
+
+/**
+ * Structure describing which tone is to be detected.
+**/
+struct _MSToneDetectorDef{
+	char tone_name[8];
+	int frequency;		/**<Expected frequency of the tone*/
+	int min_duration;	/**<Min duration of the tone in milliseconds */
+	float min_amplitude; /**<Minimum amplitude of the tone, 1.0 corresponding to the normalized 0dbm level */
+};
+
+typedef struct _MSToneDetectorDef MSToneDetectorDef;
+
+/**
+ * Structure carried as argument of the MS_TONE_DETECTOR_EVENT
+**/
+struct _MSToneDetectorEvent{
+	char tone_name[8];
+	uint64_t tone_start_time;	/**<Tone start time in millisecond */
+};
+
+typedef struct _MSToneDetectorEvent MSToneDetectorEvent;
+
+/** Method to as the tone detector filter to monitor a new tone type.*/
+#define MS_TONE_DETECTOR_ADD_SCAN	MS_FILTER_METHOD(MS_TONE_DETECTOR_ID,0,MSToneDetectorDef)
+
+/** Remove previously added scans*/
+#define MS_TONE_DETECTOR_CLEAR_SCANS	MS_FILTER_METHOD_NO_ARG(MS_TONE_DETECTOR_ID,1)
+
+/** Event generated when a tone is detected */
+#define MS_TONE_DETECTOR_EVENT		MS_FILTER_EVENT(MS_TONE_DETECTOR_ID,0,MSToneDetectorEvent)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msudp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msudp.h"
new file mode 100755
index 0000000..b10a2a3
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msudp.h"
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef msudp_hh
+#define msudp_hh
+
+#include <mediastreamer2/msfilter.h>
+
+typedef struct _MSIPPort {
+	char *ip;
+	int port;
+} MSIPPort;
+
+#define MS_UDP_SEND_SET_DESTINATION		MS_FILTER_METHOD(MS_UDP_SEND_ID,1,const MSIPPort*)
+
+extern MSFilterDesc ms_udp_send_desc;
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msutils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msutils.h"
new file mode 100755
index 0000000..2f3a309
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msutils.h"
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msutils_h
+#define msutils_h
+
+#include "mediastreamer2/mscommon.h"
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef void (*MSAudioDiffProgressNotify)(void* user_data, int percentage);
+
+typedef struct _MSAudioDiffParams{
+	int max_shift_percent; /*percentage of overlap between the two signals, used to restrict the cross correlation around t=0 in range [1 ; 100].*/
+	int chunk_size_ms; /*chunk size in milliseconds, if chunked cross correlation is to be used. Use 0 otherwise.*/
+}MSAudioDiffParams;
+
+
+/**
+ * Utility that compares two PCM 16 bits audio files and returns a similarity factor between 0 and 1.
+ * @param ref_file path to a wav file contaning the reference audio segment
+ * @param matched_file path to a wav file contaning the audio segment where the reference file is to be matched.
+ * @param ret the similarity factor, set in return
+ * @param max_shift_percent percentage of overlap between the two signals, used to restrict the cross correlation around t=0 in range [1 ; 100].
+ * @param func a callback called to show progress of the operation
+ * @param user_data a user data passed to the callback when invoked.
+ * @return -1 on error, 0 if succesful.
+**/
+MS2_PUBLIC int ms_audio_diff(const char *ref_file, const char *matched_file, double *ret, const MSAudioDiffParams *params, MSAudioDiffProgressNotify func, void *user_data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msv4l.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msv4l.h"
new file mode 100755
index 0000000..7ea57ad
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msv4l.h"
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msv4l_h
+#define msv4l_h
+
+#include <mediastreamer2/msfilter.h>
+
+#define	MS_V4L_START		MS_FILTER_METHOD_NO_ARG(MS_V4L_ID,0)
+#define	MS_V4L_STOP			MS_FILTER_METHOD_NO_ARG(MS_V4L_ID,1)
+#define	MS_V4L_SET_DEVICE	MS_FILTER_METHOD(MS_V4L_ID,2,int)
+#define	MS_V4L_SET_IMAGE	MS_FILTER_METHOD(MS_V4L_ID,3,char)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvaddtx.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvaddtx.h"
new file mode 100755
index 0000000..ad0040b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvaddtx.h"
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msvaddtx_h
+#define msvaddtx_h
+
+#include "mediastreamer2/msfilter.h"
+
+typedef struct _MSCngData{
+	int datasize;
+	uint8_t data[32];
+}MSCngData;
+
+/** Event generated when silence is detected. Payload contains the data encoding the background noise*/
+#define MS_VAD_DTX_NO_VOICE	MS_FILTER_EVENT(MS_VAD_DTX_ID, 0, MSCngData)
+
+#define MS_VAD_DTX_VOICE	MS_FILTER_EVENT_NO_ARG(MS_VAD_DTX_ID, 1)
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideo.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideo.h"
new file mode 100755
index 0000000..59eada5
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideo.h"
@@ -0,0 +1,484 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msvideo_h
+#define msvideo_h
+
+#include <mediastreamer2/msfilter.h>
+
+
+/* some global constants for video MSFilter(s) */
+#define MS_VIDEO_SIZE_UNKNOWN_W 0
+#define MS_VIDEO_SIZE_UNKNOWN_H 0
+
+#define MS_VIDEO_SIZE_SQCIF_W 128
+#define MS_VIDEO_SIZE_SQCIF_H 96
+
+#define MS_VIDEO_SIZE_WQCIF_W 256
+#define MS_VIDEO_SIZE_WQCIF_H 144
+
+#define MS_VIDEO_SIZE_QCIF_W 176
+#define MS_VIDEO_SIZE_QCIF_H 144
+
+#define MS_VIDEO_SIZE_CIF_W 352
+#define MS_VIDEO_SIZE_CIF_H 288
+
+#define MS_VIDEO_SIZE_CVD_W 352
+#define MS_VIDEO_SIZE_CVD_H 480
+
+#define MS_VIDEO_SIZE_ICIF_W 352
+#define MS_VIDEO_SIZE_ICIF_H 576
+
+#define MS_VIDEO_SIZE_4CIF_W 704
+#define MS_VIDEO_SIZE_4CIF_H 576
+
+#define MS_VIDEO_SIZE_W4CIF_W 1024
+#define MS_VIDEO_SIZE_W4CIF_H 576
+
+#define MS_VIDEO_SIZE_QQVGA_W 160
+#define MS_VIDEO_SIZE_QQVGA_H 120
+
+#define MS_VIDEO_SIZE_HQVGA_W 160
+#define MS_VIDEO_SIZE_HQVGA_H 240
+
+#define MS_VIDEO_SIZE_QVGA_W 320
+#define MS_VIDEO_SIZE_QVGA_H 240
+
+#define MS_VIDEO_SIZE_HVGA_W 320
+#define MS_VIDEO_SIZE_HVGA_H 480
+
+#define MS_VIDEO_SIZE_VGA_W 640
+#define MS_VIDEO_SIZE_VGA_H 480
+
+#define MS_VIDEO_SIZE_SVGA_W 800
+#define MS_VIDEO_SIZE_SVGA_H 600
+
+#define MS_VIDEO_SIZE_NS1_W 324
+#define MS_VIDEO_SIZE_NS1_H 248
+
+#define MS_VIDEO_SIZE_QSIF_W 176
+#define MS_VIDEO_SIZE_QSIF_H 120
+
+#define MS_VIDEO_SIZE_SIF_W 352
+#define MS_VIDEO_SIZE_SIF_H 240
+
+#define MS_VIDEO_SIZE_IOS_MEDIUM_W 480
+#define MS_VIDEO_SIZE_IOS_MEDIUM_H 360
+
+#define MS_VIDEO_SIZE_ISIF_W 352
+#define MS_VIDEO_SIZE_ISIF_H 480
+
+#define MS_VIDEO_SIZE_4SIF_W 704
+#define MS_VIDEO_SIZE_4SIF_H 480
+
+#define MS_VIDEO_SIZE_288P_W 512
+#define MS_VIDEO_SIZE_288P_H 288
+
+#define MS_VIDEO_SIZE_432P_W 768
+#define MS_VIDEO_SIZE_432P_H 432
+
+#define MS_VIDEO_SIZE_448P_W 768
+#define MS_VIDEO_SIZE_448P_H 448
+
+#define MS_VIDEO_SIZE_480P_W 848
+#define MS_VIDEO_SIZE_480P_H 480
+
+#define MS_VIDEO_SIZE_576P_W 1024
+#define MS_VIDEO_SIZE_576P_H 576
+
+#define MS_VIDEO_SIZE_720P_W 1280
+#define MS_VIDEO_SIZE_720P_H 720
+
+#define MS_VIDEO_SIZE_1080P_W 1920
+#define MS_VIDEO_SIZE_1080P_H 1080
+
+#define MS_VIDEO_SIZE_SDTV_W 768
+#define MS_VIDEO_SIZE_SDTV_H 576
+
+#define MS_VIDEO_SIZE_HDTVP_W 1920
+#define MS_VIDEO_SIZE_HDTVP_H 1200
+
+#define MS_VIDEO_SIZE_XGA_W 1024
+#define MS_VIDEO_SIZE_XGA_H 768
+
+#define MS_VIDEO_SIZE_WXGA_W 1080
+#define MS_VIDEO_SIZE_WXGA_H 768
+
+#define MS_VIDEO_SIZE_SXGA_MINUS_W 1280
+#define MS_VIDEO_SIZE_SXGA_MINUS_H 960
+
+#define MS_VIDEO_SIZE_UXGA_W 1600
+#define MS_VIDEO_SIZE_UXGA_H 1200
+
+typedef struct MSRect{
+	int x,y,w,h;
+} MSRect;
+
+/**
+ * Structure describing a video configuration to be able to define a video size, a FPS
+ * and some other parameters according to the desired bitrate.
+ */
+struct _MSVideoConfiguration {
+	int required_bitrate;	/**< The minimum bitrate required for the video configuration to be used. */
+	int bitrate_limit;	/**< The maximum bitrate to use when this video configuration is used. */
+	MSVideoSize vsize;	/**< The video size that is used when using this video configuration. */
+	float fps;	/**< The FPS that is used when using this video configuration. */
+	int mincpu;	/**< The minimum cpu count necessary when this configuration is used */
+	void *extra;	/**< A pointer to some extra parameters that may be used by the encoder when using this video configuration. */
+};
+
+#define MS_VIDEO_CONF(required_bitrate, bitrate_limit, resolution, fps, mincpu) \
+	{ required_bitrate, bitrate_limit, { MS_VIDEO_SIZE_ ## resolution ## _W, MS_VIDEO_SIZE_ ## resolution ## _H }, fps, mincpu, NULL }
+
+/**
+ * Definition of the MSVideoConfiguration type.
+ * @see struct _MSVideoConfiguration
+ */
+typedef struct _MSVideoConfiguration MSVideoConfiguration;
+
+#ifdef __cplusplus
+	#define MS_VIDEO_SIZE_TYPE MSVideoSize
+#else
+	#define MS_VIDEO_SIZE_TYPE (MSVideoSize)
+#endif // ifdef __cplusplus
+
+#define MS_VIDEO_SIZE_UNKNOWN MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_UNKNOWN_W, MS_VIDEO_SIZE_UNKNOWN_H }
+
+#define MS_VIDEO_SIZE_CIF MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_CIF_W, MS_VIDEO_SIZE_CIF_H }
+#define MS_VIDEO_SIZE_QCIF MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_QCIF_W, MS_VIDEO_SIZE_QCIF_H }
+#define MS_VIDEO_SIZE_4CIF MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_4CIF_W, MS_VIDEO_SIZE_4CIF_H }
+#define MS_VIDEO_SIZE_CVD MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_CVD_W,  MS_VIDEO_SIZE_CVD_H }
+#define MS_VIDEO_SIZE_QQVGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_QQVGA_W, MS_VIDEO_SIZE_QQVGA_H }
+#define MS_VIDEO_SIZE_QVGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_QVGA_W, MS_VIDEO_SIZE_QVGA_H }
+#define MS_VIDEO_SIZE_VGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_VGA_W, MS_VIDEO_SIZE_VGA_H }
+
+#define MS_VIDEO_SIZE_IOS_MEDIUM MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_IOS_MEDIUM_W, MS_VIDEO_SIZE_IOS_MEDIUM_H }
+
+#define MS_VIDEO_SIZE_720P MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_720P_W, MS_VIDEO_SIZE_720P_H }
+
+#define MS_VIDEO_SIZE_1080P MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_1080P_W, MS_VIDEO_SIZE_1080P_H }
+
+#define MS_VIDEO_SIZE_NS1 MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_NS1_W,MS_VIDEO_SIZE_NS1_H }
+
+#define MS_VIDEO_SIZE_XGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_XGA_W, MS_VIDEO_SIZE_XGA_H }
+
+#define MS_VIDEO_SIZE_SVGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_SVGA_W, MS_VIDEO_SIZE_SVGA_H }
+
+#define MS_VIDEO_SIZE_SXGA_MINUS MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_SXGA_MINUS_W, MS_VIDEO_SIZE_SXGA_MINUS_H }
+
+#define MS_VIDEO_SIZE_UXGA MS_VIDEO_SIZE_TYPE{ MS_VIDEO_SIZE_UXGA_W, MS_VIDEO_SIZE_UXGA_H }
+
+#ifdef _MSC_VER
+#define MS_VIDEO_SIZE_ASSIGN(vsize,name) \
+	{\
+	(vsize).width=MS_VIDEO_SIZE_##name##_W; \
+	(vsize).height=MS_VIDEO_SIZE_##name##_H; \
+	}
+#else
+#define MS_VIDEO_SIZE_ASSIGN(vsize,name) \
+	vsize=MS_VIDEO_SIZE_##name
+#endif
+
+/*deprecated: use MS_VIDEO_SIZE_SVGA*/
+#define MS_VIDEO_SIZE_800X600_W MS_VIDEO_SIZE_SVGA_W
+#define MS_VIDEO_SIZE_800X600_H MS_VIDEO_SIZE_SVGA_H
+#define MS_VIDEO_SIZE_800X600 MS_VIDEO_SIZE_SVGA
+/*deprecated use MS_VIDEO_SIZE_XGA*/
+#define MS_VIDEO_SIZE_1024_W 1024
+#define MS_VIDEO_SIZE_1024_H 768
+#define MS_VIDEO_SIZE_1024 MS_VIDEO_SIZE_XGA
+
+typedef enum{
+	MS_NO_MIRROR,
+	MS_HORIZONTAL_MIRROR, /*according to a vertical line in the center of buffer*/
+	MS_CENTRAL_MIRROR, /*both*/
+	MS_VERTICAL_MIRROR /*according to an horizontal line*/
+}MSMirrorType;
+
+typedef enum MSVideoOrientation{
+	MS_VIDEO_LANDSCAPE = 0,
+	MS_VIDEO_PORTRAIT =1
+}MSVideoOrientation;
+
+typedef enum{
+	MS_PIX_FMT_UNKNOWN, /* First, so that it's value does not change. */
+	MS_YUV420P,
+	MS_YUYV,
+	MS_RGB24,
+	MS_RGB24_REV, /*->microsoft down-top bitmaps */
+	MS_MJPEG,
+	MS_UYVY,
+	MS_YUY2,   /* -> same as MS_YUYV */
+	MS_RGBA32,
+	MS_RGB565,
+	MS_H264
+}MSPixFmt;
+
+typedef struct _MSPicture{
+	int w,h;
+	uint8_t *planes[4]; /* we usually use 3 planes, 4th is for compatibility with ffmpeg's swscale.h */
+	int strides[4];	/* Bytes per row */
+}MSPicture;
+
+typedef struct _MSPicture YuvBuf; /*for backward compatibility*/
+
+typedef msgb_allocator_t MSYuvBufAllocator;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+MS2_PUBLIC bool_t ms_rect_equal(const MSRect *r1, const MSRect *r2);
+
+MS2_PUBLIC const char *ms_pix_fmt_to_string(MSPixFmt fmt);
+MS2_PUBLIC int ms_pix_fmt_to_ffmpeg(MSPixFmt fmt);
+MS2_PUBLIC MSPixFmt ffmpeg_pix_fmt_to_ms(int fmt);
+MS2_PUBLIC MSPixFmt ms_fourcc_to_pix_fmt(uint32_t fourcc);
+MS2_PUBLIC void ms_ffmpeg_check_init(void);
+MS2_PUBLIC void ms_yuv_buf_init(YuvBuf *buf, int w, int h, int stride, uint8_t *ptr);
+MS2_PUBLIC int ms_yuv_buf_init_from_mblk(MSPicture *buf, mblk_t *m);
+MS2_PUBLIC int ms_yuv_buf_init_from_mblk_with_size(MSPicture *buf, mblk_t *m, int w, int h);
+MS2_PUBLIC int ms_picture_init_from_mblk_with_size(MSPicture *buf, mblk_t *m, MSPixFmt fmt, int w, int h);
+MS2_PUBLIC mblk_t * ms_yuv_buf_alloc(MSPicture *buf, int w, int h);
+
+/* Allocates a video mblk_t with supplied width and height, the pixels being contained in an external buffer.
+The returned mblk_t points to the external buffer, which is not copied, nor ref'd: the reference is simply transfered to the returned mblk_t*/
+MS2_PUBLIC mblk_t * ms_yuv_buf_alloc_from_buffer(int w, int h, mblk_t* buffer);
+MS2_PUBLIC void ms_yuv_buf_copy(uint8_t *src_planes[], const int src_strides[],
+		uint8_t *dst_planes[], const int dst_strides[], MSVideoSize roi);
+MS2_PUBLIC void ms_yuv_buf_copy_with_pix_strides(uint8_t *src_planes[], const int src_row_strides[], const int src_pix_strides[], MSRect src_roi,
+		uint8_t *dst_planes[], const int dst_row_strides[], const int dst_pix_strides[], MSRect dst_roi);
+MS2_PUBLIC void ms_yuv_buf_mirror(YuvBuf *buf);
+MS2_PUBLIC void ms_yuv_buf_mirrors(YuvBuf *buf,const MSMirrorType type);
+MS2_PUBLIC void rgb24_mirror(uint8_t *buf, int w, int h, int linesize);
+MS2_PUBLIC void rgb24_revert(uint8_t *buf, int w, int h, int linesize);
+MS2_PUBLIC void rgb24_copy_revert(uint8_t *dstbuf, int dstlsz,
+				const uint8_t *srcbuf, int srclsz, MSVideoSize roi);
+
+MS2_PUBLIC MSYuvBufAllocator *ms_yuv_buf_allocator_new(void);
+MS2_PUBLIC mblk_t *ms_yuv_buf_allocator_get(MSYuvBufAllocator *obj, MSPicture *buf, int w, int h);
+MS2_PUBLIC void ms_yuv_buf_allocator_free(MSYuvBufAllocator *obj);
+
+MS2_PUBLIC void ms_rgb_to_yuv(const uint8_t rgb[3], uint8_t yuv[3]);
+
+
+#ifdef MS_HAS_ARM
+MS2_PUBLIC void rotate_plane_neon_clockwise(int wDest, int hDest, int full_width, const uint8_t* src, uint8_t* dst);
+MS2_PUBLIC void rotate_plane_neon_anticlockwise(int wDest, int hDest, int full_width, const uint8_t* src, uint8_t* dst);
+MS2_PUBLIC void deinterlace_and_rotate_180_neon(const uint8_t* ysrc, const uint8_t* cbcrsrc, uint8_t* ydst, uint8_t* udst, uint8_t* vdst, int w, int h, int y_byte_per_row,int cbcr_byte_per_row);
+void deinterlace_down_scale_and_rotate_180_neon(const uint8_t* ysrc, const uint8_t* cbcrsrc, uint8_t* ydst, uint8_t* udst, uint8_t* vdst, int w, int h, int y_byte_per_row,int cbcr_byte_per_row,bool_t down_scale);
+void deinterlace_down_scale_neon(const uint8_t* ysrc, const uint8_t* cbcrsrc, uint8_t* ydst, uint8_t* u_dst, uint8_t* v_dst, int w, int h, int y_byte_per_row,int cbcr_byte_per_row,bool_t down_scale);
+#endif
+
+/**
+ * This functions copies a an YUV420 semi-planar (UV packed in a single plane) to normal YUV420 (three planes), by eventually performing a rotation and a downscale by a factor of two.
+ * @param allocator a MSYuvBufAllocator from which the returned mblk_t will be allocated.
+ * @param y pointer to the source Y plane pointer.
+ * @param cbcr pointer to the source UV (or cbcr) plane.
+ * @param rotation the rotation to apply to the source image, expressed in angles (0, 90, 180, 270).
+ * @param dest_w the width of the requested destination image
+ * @param dest_h the height of the requested destination image
+ * @param y_byte_per_row the stride for the source y plane, ie the number of bytes to move by one row.
+ * @param cbcr_byte_per_row the stride for the source uv plane, ie the number of bytes to move by one row.
+ * @param uFirstvSecond a boolean to be set to TRUE if the UV plan starts with U, followed by V. This function can be used to process YVU420 semi planar images.
+ * @param down_scale set to TRUE if you wish a downscale by two of the source image.
+ * @return a mblk_t containing the converted and transformed image according to the parameters give above.
+ * 
+ * @REVISIT This function suffers from several deficiencies that makes it difficult to use. It could be reworked in the following way:
+ * - first rename it to have correct prefix ms_video_*something*, and use "yuv" wording rather than cbcr, to make it consistent with other functions in mediastreamer.
+ * - it should take as input the width and height of the source buffer. To be more concise, the MSPicture structure could be use to represent the source image.
+ * - it should not take the destination width and height, as they can be easily guessed from the source size and the transformation requested.
+**/
+
+MS2_PUBLIC mblk_t *copy_ycbcrbiplanar_to_true_yuv_with_rotation_and_down_scale_by_2(MSYuvBufAllocator *allocator, const uint8_t* y, const uint8_t * cbcr, int rotation, int dest_w, int dest_h, int y_byte_per_row,int cbcr_byte_per_row, bool_t uFirstvSecond, bool_t down_scale);
+
+static MS2_INLINE MSVideoSize ms_video_size_make(int width, int height){
+	MSVideoSize vsize;
+	vsize.width = width;
+	vsize.height = height;
+	return vsize;
+}
+
+static MS2_INLINE bool_t ms_video_size_greater_than(MSVideoSize vs1, MSVideoSize vs2){
+	return (vs1.width>=vs2.width) && (vs1.height>=vs2.height);
+}
+
+static MS2_INLINE bool_t ms_video_size_area_greater_than(MSVideoSize vs1, MSVideoSize vs2){
+	return (vs1.width*vs1.height >= vs2.width*vs2.height);
+}
+
+static MS2_INLINE bool_t ms_video_size_area_strictly_greater_than(MSVideoSize vs1, MSVideoSize vs2){
+	return (vs1.width*vs1.height > vs2.width*vs2.height);
+}
+
+static MS2_INLINE MSVideoSize ms_video_size_max(MSVideoSize vs1, MSVideoSize vs2){
+	return ms_video_size_greater_than(vs1,vs2) ? vs1 : vs2;
+}
+
+static MS2_INLINE MSVideoSize ms_video_size_min(MSVideoSize vs1, MSVideoSize vs2){
+	return ms_video_size_greater_than(vs1,vs2) ? vs2 : vs1;
+}
+
+static MS2_INLINE MSVideoSize ms_video_size_area_max(MSVideoSize vs1, MSVideoSize vs2){
+	return ms_video_size_area_greater_than(vs1,vs2) ? vs1 : vs2;
+}
+
+static MS2_INLINE MSVideoSize ms_video_size_area_min(MSVideoSize vs1, MSVideoSize vs2){
+	return ms_video_size_area_greater_than(vs1,vs2) ? vs2 : vs1;
+}
+
+static MS2_INLINE bool_t ms_video_size_equal(MSVideoSize vs1, MSVideoSize vs2){
+	return vs1.width==vs2.width && vs1.height==vs2.height;
+}
+
+MS2_PUBLIC MSVideoSize ms_video_size_get_just_lower_than(MSVideoSize vs);
+
+static MS2_INLINE MSVideoOrientation ms_video_size_get_orientation(MSVideoSize vs){
+	return vs.width>=vs.height ? MS_VIDEO_LANDSCAPE : MS_VIDEO_PORTRAIT;
+}
+
+static MS2_INLINE MSVideoSize ms_video_size_change_orientation(MSVideoSize vs, MSVideoOrientation o){
+	MSVideoSize ret;
+	if (o!=ms_video_size_get_orientation(vs)){
+		ret.width=vs.height;
+		ret.height=vs.width;
+	}else ret=vs;
+	return ret;
+}
+
+/* abstraction for image scaling and color space conversion routines*/
+
+typedef struct _MSScalerContext MSScalerContext;
+
+#define MS_SCALER_METHOD_NEIGHBOUR 1
+#define MS_SCALER_METHOD_BILINEAR (1<<1)
+
+struct _MSScalerDesc {
+	MSScalerContext * (*create_context)(int src_w, int src_h, MSPixFmt src_fmt,
+                                         int dst_w, int dst_h, MSPixFmt dst_fmt, int flags);
+	int (*context_process)(MSScalerContext *ctx, uint8_t *src[], int src_strides[], uint8_t *dst[], int dst_strides[]);
+	void (*context_free)(MSScalerContext *ctx);
+};
+
+typedef struct  _MSScalerDesc MSScalerDesc;
+
+MS2_PUBLIC MSScalerContext *ms_scaler_create_context(int src_w, int src_h, MSPixFmt src_fmt,
+                                          int dst_w, int dst_h, MSPixFmt dst_fmt, int flags);
+
+MS2_PUBLIC int ms_scaler_process(MSScalerContext *ctx, uint8_t *src[], int src_strides[], uint8_t *dst[], int dst_strides[]);
+
+MS2_PUBLIC void ms_scaler_context_free(MSScalerContext *ctx);
+
+MS2_PUBLIC void ms_video_set_scaler_impl(MSScalerDesc *desc);
+
+MS2_PUBLIC MSScalerDesc * ms_video_get_scaler_impl(void);
+
+
+/**
+ * Wrapper function around copy_ycbcrbiplanar_to_true_yuv_with_rotation_and_down_scale_by_2().
+ */
+MS2_PUBLIC mblk_t *copy_ycbcrbiplanar_to_true_yuv_with_rotation(MSYuvBufAllocator *allocator, const uint8_t* y, const uint8_t* cbcr, int rotation, int w, int h, int y_byte_per_row,int cbcr_byte_per_row, bool_t uFirstvSecond);
+
+MS2_PUBLIC mblk_t *copy_yuv_with_rotation(MSYuvBufAllocator *allocator, const uint8_t* y, const uint8_t* u, const uint8_t* v, int rotation, int w, int h, int y_byte_per_row, int u_byte_per_row, int v_byte_per_row);
+
+/*** Encoder Helpers ***/
+/* Frame rate controller */
+struct _MSFrameRateController {
+	uint64_t start_time;
+	int th_frame_count;
+	float fps;
+};
+typedef struct _MSFrameRateController MSFrameRateController;
+MS2_PUBLIC void ms_video_init_framerate_controller(MSFrameRateController* ctrl, float fps);
+MS2_PUBLIC bool_t ms_video_capture_new_frame(MSFrameRateController* ctrl, uint64_t current_time);
+
+/* Average FPS calculator */
+struct _MSAverageFPS {
+	uint64_t last_frame_time, last_print_time;
+	float mean_inter_frame;
+	const char* context;
+};
+typedef struct _MSAverageFPS MSAverageFPS;
+MS2_PUBLIC void ms_average_fps_init(MSAverageFPS* afps, const char* context);
+MS2_PUBLIC bool_t ms_average_fps_update(MSAverageFPS* afps, uint64_t current_time);
+MS2_PUBLIC float ms_average_fps_get(const MSAverageFPS* afps);
+
+/*deprecated: for compatibility with plugin*/
+MS2_PUBLIC void ms_video_init_average_fps(MSAverageFPS* afps, const char* ctx);
+MS2_PUBLIC bool_t ms_video_update_average_fps(MSAverageFPS* afps, uint64_t current_time);
+
+
+/**
+ * Find the best video configuration from a list of configurations according to a given bitrate limit.
+ * @param[in] vconf_list The list of video configurations to choose from.
+ * @param[in] bitrate The maximum bitrate limit the chosen configuration is allowed to use.
+ * @param[in] cpucount the number of cpu that can be used for this encoding.
+ * @return The best video configuration found in the given list.
+ */
+MS2_PUBLIC MSVideoConfiguration ms_video_find_best_configuration_for_bitrate(const MSVideoConfiguration *vconf_list, int bitrate, int cpucount);
+
+/**
+ * Find the best video configuration from a list of configuration according to a given video size.
+ * @param[in] vconf_list The list of video configurations to choose from.
+ * @param[in] vsize The maximum video size the chosen configuration is allowed to use.
+ * @param[in] cpucount the number of cpu that can be used for this encoding.
+ * @return The best video configuration found in the given list.
+ */
+MS2_PUBLIC MSVideoConfiguration ms_video_find_best_configuration_for_size(const MSVideoConfiguration *vconf_list, MSVideoSize vsize, int cpucount);
+
+/**
+ * Find the worst video configuration from a list of configuration according to a given video size.
+ * @param[in] vconf_list The list of video configurations to choose from.
+ * @param[in] vsize The maximum video size the chosen configuration is allowed to use.
+ * @param[in] cpucount the number of cpu that can be used for this encoding.
+ * @return The best video configuration found in the given list.
+ */
+MS2_PUBLIC MSVideoConfiguration ms_video_find_worst_configuration_for_size(const MSVideoConfiguration *vconf_list, MSVideoSize vsize, int cpucount);
+
+MS2_PUBLIC MSVideoConfiguration ms_video_find_best_configuration_for_size_and_bitrate(const MSVideoConfiguration *vconf_list, MSVideoSize vsize, int cpu_count, int bitrate);
+
+/**
+ * Compares two video configurations and tell if they are equals.
+ * @param[in] vconf1 The first video configuration.
+ * @param[in] vconf2 The second video configuration.
+ * @return true if both configurations are equal, false otherwise.
+ */
+MS2_PUBLIC bool_t ms_video_configuratons_equal(const MSVideoConfiguration *vconf1, const MSVideoConfiguration *vconf2);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define MS_FILTER_SET_VIDEO_SIZE	MS_FILTER_BASE_METHOD(100,MSVideoSize)
+#define MS_FILTER_GET_VIDEO_SIZE	MS_FILTER_BASE_METHOD(101,MSVideoSize)
+
+#define MS_FILTER_SET_PIX_FMT		MS_FILTER_BASE_METHOD(102,MSPixFmt)
+#define MS_FILTER_GET_PIX_FMT		MS_FILTER_BASE_METHOD(103,MSPixFmt)
+
+#define MS_FILTER_SET_FPS		MS_FILTER_BASE_METHOD(104,float)
+#define MS_FILTER_GET_FPS		MS_FILTER_BASE_METHOD(105,float)
+
+#define MS_FILTER_VIDEO_AUTO		((unsigned long) 0)
+#define MS_FILTER_VIDEO_NONE		((unsigned long) -1)
+
+/* request a video-fast-update (=I frame for H263,MP4V-ES) to a video encoder*/
+/* DEPRECATED: Use MS_VIDEO_ENCODER_REQ_VFU instead */
+#define MS_FILTER_REQ_VFU		MS_FILTER_BASE_METHOD_NO_ARG(106)
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideoout.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideoout.h"
new file mode 100755
index 0000000..8246d44
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideoout.h"
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msvideoout_h
+#define msvideoout_h
+
+#include <mediastreamer2/msfilter.h>
+#include <mediastreamer2/msvideo.h>
+
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideopresets.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideopresets.h"
new file mode 100755
index 0000000..9c78071
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideopresets.h"
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MSVIDEOPRESETS_H
+#define MSVIDEOPRESETS_H
+
+#include <mediastreamer2/mscommon.h>
+#include <mediastreamer2/msfilter.h>
+#include <mediastreamer2/msfactory.h>
+#include <mediastreamer2/msvideo.h>
+
+/**
+ * @file msvideopresets.h
+ * @brief mediastreamer2 msvideopresets.h include file
+ *
+ * This file provide the API needed to manage video presets.
+ *
+ */
+
+/**
+ * @ingroup mediastreamer2_api
+ * @{
+ */
+
+/**
+ * Structure for video presets manager object.
+ */
+typedef struct _MSVideoPresetsManager MSVideoPresetsManager;
+
+/**
+ * Structure for video preset configuration object.
+ */
+typedef struct _MSVideoPresetConfiguration MSVideoPresetConfiguration;
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Create a video presets manager object.
+ * @param[in] The MSFactory to add the new video presets manager to.
+ * @return The new MSVideoPresetsManager object.
+ */
+MS2_PUBLIC MSVideoPresetsManager * ms_video_presets_manager_new(MSFactory *factory);
+
+/**
+ * Destroy the video presets manager object.
+ * @param[in] manager The MSVideoPresetsManager to destroy.
+ */
+MS2_PUBLIC void ms_video_presets_manager_destroy(MSVideoPresetsManager *manager);
+
+/**
+ * Register a video preset configuration.
+ * @param[in] manager The MSVideoPresetsManager object.
+ * @param[in] name The name of the video preset to register.
+ * @param[in] tags A comma-separated list of tags describing the video preset.
+ * @param[in] config The MSVideoConfiguration that is to be registered in the specified preset with the specified tags.
+ */
+MS2_PUBLIC void ms_video_presets_manager_register_preset_configuration(MSVideoPresetsManager *manager,
+	const char *name, const char *tags, MSVideoConfiguration *config);
+
+/**
+ * Search for a video preset configuration.
+ * @param[in] manager The MSVideoPresetsManager object.
+ * @param[in] name The name of the video preset to search for.
+ * @param[in] codecs_tags A list of tags describing the codec that will be used to select the video configuration to return.
+ * @return The MSVideoConfiguration corresponding to the video preset being searched for and matching the codec_tags and
+ * the platform tags.
+ */
+MS2_PUBLIC MSVideoPresetConfiguration * ms_video_presets_manager_find_preset_configuration(MSVideoPresetsManager *manager,
+	const char *name, MSList *codec_tags);
+
+/**
+ * Get the video configuration corresponding to a video preset configuration.
+ * @param[in] vpc MSVideoPresetConfiguration object obtained with ms_video_presets_manager_find_preset_configuration()
+ * @return The MSVideoConfiguration corresponding to the video preset configuration.
+ */
+MS2_PUBLIC MSVideoConfiguration * ms_video_preset_configuration_get_video_configuration(MSVideoPresetConfiguration *vpc);
+
+/**
+ * Get the tags corresponding to a video preset configuration.
+ * @param[in] vpc MSVideoPresetConfiguration object obtained with ms_video_presets_manager_find_preset_configuration()
+ * @return A comma-separated list of tags describing the video preset configuration.
+ */
+MS2_PUBLIC char * ms_video_preset_configuration_get_tags_as_string(MSVideoPresetConfiguration *vpc);
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideoqualitycontroller.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideoqualitycontroller.h"
new file mode 100755
index 0000000..bddd2b8
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvideoqualitycontroller.h"
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msvideoqualitycontroller_h
+#define msvideoqualitycontroller_h
+
+#include "mediastreamer2/msvideo.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct _VideoStream;
+
+struct _MSVideoQualityController {
+	struct _VideoStream *stream;
+	int last_tmmbr;
+	MSVideoSize last_vsize;
+	
+	time_t increase_timer_start;
+	bool_t increase_timer_running;
+};
+
+typedef struct _MSVideoQualityController MSVideoQualityController;
+
+MS2_PUBLIC MSVideoQualityController *ms_video_quality_controller_new(struct _VideoStream *stream);
+MS2_PUBLIC void ms_video_quality_controller_destroy(MSVideoQualityController *obj);
+
+MS2_PUBLIC void ms_video_quality_controller_process_timer(MSVideoQualityController *obj);
+MS2_PUBLIC void ms_video_quality_controller_update_from_tmmbr(MSVideoQualityController *obj, int tmmbr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msvideoqualitycontroller_h */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvolume.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvolume.h"
new file mode 100755
index 0000000..6b8d0a8
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/msvolume.h"
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef msvolume_h
+#define msvolume_h
+
+#include <mediastreamer2/msfilter.h>
+
+/**
+ * The Volume MSFilter can do:
+ * 	- measurements of the input signal power, returned in dbm0 or linear scale
+ * 	- apply a gain to the input signal and output this amplified signal to its output.
+ * By default gain is 1, in which case the filter does not modify the signal (and even does not
+ * copy the buffers, just post them on its output queue.
+**/
+
+
+/*returns a volume meter in db0 (max=0 db0)*/
+#define MS_VOLUME_GET		MS_FILTER_METHOD(MS_VOLUME_ID,0,float)
+/*returns a volume in linear scale between 0 and 1 */
+#define MS_VOLUME_GET_LINEAR		MS_FILTER_METHOD(MS_VOLUME_ID,1,float)
+/* set a gain */
+#define MS_VOLUME_SET_GAIN		MS_FILTER_METHOD(MS_VOLUME_ID,2,float)
+
+#define MS_VOLUME_SET_PEER		MS_FILTER_METHOD(MS_VOLUME_ID,4, MSFilter )
+
+#define MS_VOLUME_SET_EA_THRESHOLD	MS_FILTER_METHOD(MS_VOLUME_ID,5,float)
+
+#define MS_VOLUME_SET_EA_SPEED		MS_FILTER_METHOD(MS_VOLUME_ID,6,float)
+
+#define MS_VOLUME_SET_EA_FORCE		MS_FILTER_METHOD(MS_VOLUME_ID,7,float)
+
+#define MS_VOLUME_ENABLE_AGC		MS_FILTER_METHOD(MS_VOLUME_ID,8,int)
+
+#define MS_VOLUME_ENABLE_NOISE_GATE	MS_FILTER_METHOD(MS_VOLUME_ID,9,int)
+
+#define MS_VOLUME_SET_NOISE_GATE_THRESHOLD	MS_FILTER_METHOD(MS_VOLUME_ID,10,float)
+
+#define MS_VOLUME_SET_EA_SUSTAIN	MS_FILTER_METHOD(MS_VOLUME_ID,11,int)
+
+#define MS_VOLUME_SET_NOISE_GATE_FLOORGAIN MS_FILTER_METHOD(MS_VOLUME_ID,12,float)
+
+/* set a gain in db */
+#define MS_VOLUME_SET_DB_GAIN		MS_FILTER_METHOD(MS_VOLUME_ID,13,float)
+
+/* get a linear gain */
+#define MS_VOLUME_GET_GAIN		MS_FILTER_METHOD(MS_VOLUME_ID,14,float)
+
+/* get the gain in db*/
+#define MS_VOLUME_GET_GAIN_DB		MS_FILTER_METHOD(MS_VOLUME_ID,15,float)
+
+#define MS_VOLUME_REMOVE_DC	MS_FILTER_METHOD(MS_VOLUME_ID,16,int)
+
+#define MS_VOLUME_SET_EA_TRANSMIT_THRESHOLD	MS_FILTER_METHOD(MS_VOLUME_ID,17,float)
+
+/**
+ * Obtain the minimum volume, in db, over the last X seconds period completed (X=30 seconds by default)
+**/
+#define MS_VOLUME_GET_MIN	MS_FILTER_METHOD(MS_VOLUME_ID,18,float)
+
+/**
+ * Obtain the maximum volume, in db, over the last X seconds period completed (X=1 second by default)
+**/
+#define MS_VOLUME_GET_MAX	MS_FILTER_METHOD(MS_VOLUME_ID,19,float)
+
+#define MS_VOLUME_DB_LOWEST		(-120)	/*arbitrary value returned when linear volume is 0*/
+
+extern MSFilterDesc ms_volume_desc;
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mswebcam.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mswebcam.h"
new file mode 100755
index 0000000..850d610
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/mswebcam.h"
@@ -0,0 +1,261 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef webcam_h
+#define webcam_h
+
+#include <mediastreamer2/mscommon.h>
+#include <mediastreamer2/msfactory.h>
+
+/**
+ * @file mswebcam.h
+ * @brief mediastreamer2 mswebcam.h include file
+ *
+ * This file provide the API needed to manage
+ * soundcard filters.
+ *
+ */
+
+/**
+ * @defgroup mediastreamer2_webcam Camera API - manage video capture devices
+ * @ingroup mediastreamer2_api
+ * @{
+ */
+
+struct _MSWebCamManager{
+	MSFactory* factory;
+	MSList *cams;
+	MSList *descs;
+};
+
+/**
+ * Structure for webcam manager object.
+ * @var MSWebCamManager
+ */
+typedef struct _MSWebCamManager MSWebCamManager;
+
+
+struct _MSWebCam;
+
+typedef void (*MSWebCamDetectFunc)(MSWebCamManager *obj);
+typedef void (*MSWebCamInitFunc)(struct _MSWebCam *obj);
+typedef void (*MSWebCamUninitFunc)(struct _MSWebCam *obj);
+typedef struct _MSFilter * (*MSWebCamCreateReaderFunc)(struct _MSWebCam *obj);
+typedef bool_t (*MSWebCamEncodeToMimeType)(struct _MSWebCam *obj, const char *mime_type);
+
+struct _MSWebCamDesc{
+	const char *driver_type;
+	MSWebCamDetectFunc detect;
+	MSWebCamInitFunc init;
+	MSWebCamCreateReaderFunc create_reader;
+	MSWebCamUninitFunc uninit;
+	MSWebCamEncodeToMimeType encode_to_mime_type;
+};
+
+/**
+ * Structure for sound card description object.
+ * @var MSWebCamDesc
+ */
+typedef struct _MSWebCamDesc MSWebCamDesc;
+
+struct _MSWebCam{
+	MSWebCamManager* wbcmanager;
+	MSWebCamDesc *desc;
+	char *name;
+	char *id;
+	void *data;
+};
+
+/**
+ * Structure for sound card object.
+ * @var MSWebCam
+ */
+typedef struct _MSWebCam MSWebCam;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Retrieve a webcam manager object.
+ *
+ * @returns: MSWebCamManager if successfull, NULL otherwise.
+ * @deprecated use ms_factory_get_web_cam_manager().
+ */
+MS2_PUBLIC MS2_DEPRECATED MSWebCamManager * ms_web_cam_manager_get(void);
+
+/**
+ * Returns the factory from the webcam object.
+ * @param c MSWebCam used to get to the factory.
+ */
+MS2_PUBLIC MSFactory * ms_web_cam_get_factory(MSWebCam *c);
+
+/**
+ * Create a webcam manager object.
+ * You usually do not need this function, instead get the webcam manager from a factory
+ * with ms_factory_get_web_cam_manager().
+ */
+MS2_PUBLIC MSWebCamManager * ms_web_cam_manager_new(void);
+
+/**
+ * Destroy the webcam manager object.
+ * You usually don't need this function, ms_factory_destroy() doing the job for you.
+ */
+MS2_PUBLIC void ms_web_cam_manager_destroy(MSWebCamManager* scm);
+
+/**
+ * Retreive a webcam object based on its name.
+ *
+ * @param m    A webcam manager containing webcam.
+ * @param id   A name for card to search.
+ *
+ * Returns: MSWebCam if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSWebCam * ms_web_cam_manager_get_cam(MSWebCamManager *m, const char *id);
+
+/**
+ * Retreive the default webcam object.
+ *
+ * @param m    A webcam manager containing webcams.
+ *
+ * Returns: MSWebCam if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSWebCam * ms_web_cam_manager_get_default_cam(MSWebCamManager *m);
+
+/**
+ * Retreive the list of webcam objects.
+ *
+ * @param m    A webcam manager containing webcams.
+ *
+ * Returns: MSList of cards if successfull, NULL otherwise.
+ */
+MS2_PUBLIC const MSList * ms_web_cam_manager_get_list(MSWebCamManager *m);
+
+/**
+ * Add a webcam object in a webcam  manager's list.
+ *
+ * @param m    A webcam  manager containing webcams
+ * @param c    A web cam object.
+ *
+ */
+MS2_PUBLIC void ms_web_cam_manager_add_cam(MSWebCamManager *m, MSWebCam *c);
+
+MS2_PUBLIC MSWebCam * ms_web_cam_manager_create_cam(MSWebCamManager *m, MSWebCamDesc *desc);
+
+MS2_PUBLIC void ms_web_cam_set_manager(MSWebCamManager*m, MSWebCam *c);
+	
+/**
+ * Add a webcam object on top of list of the webcam  manager's list.
+ *
+ * @param m    A webcam  manager containing webcams
+ * @param c    A web cam object.
+ *
+ */
+MS2_PUBLIC void ms_web_cam_manager_prepend_cam(MSWebCamManager *m, MSWebCam *c);
+
+
+/**
+ * Register a webcam descriptor in a webcam manager.
+ *
+ * @param m      A webcam manager containing sound cards.
+ * @param desc   A webcam descriptor object.
+ *
+ */
+MS2_PUBLIC void ms_web_cam_manager_register_desc(MSWebCamManager *m, MSWebCamDesc *desc);
+
+
+/**
+ * Ask all registered MSWebCamDesc to detect the webcams again.
+ *
+ * @param m A webcam manager
+**/
+MS2_PUBLIC void ms_web_cam_manager_reload(MSWebCamManager *m);
+
+/**
+ * Create an INPUT filter based on the selected camera.
+ *
+ * @param obj      A webcam object.
+ *
+ * Returns: A MSFilter if successfull, NULL otherwise.
+ */
+MS2_PUBLIC struct _MSFilter * ms_web_cam_create_reader(MSWebCam *obj);
+
+/**
+ * Create a new webcam object.
+ *
+ * @param desc   A webcam description object.
+ *
+ * Returns: MSWebCam if successfull, NULL otherwise.
+ */
+MS2_PUBLIC MSWebCam * ms_web_cam_new(MSWebCamDesc *desc);
+
+/**
+ * Destroy webcam object.
+ *
+ * @param obj   A MSWebCam object.
+ */
+MS2_PUBLIC void ms_web_cam_destroy(MSWebCam *obj);
+
+
+/**
+ * Retreive a webcam's driver type string.
+ *
+ * Internal driver types are either: "V4L V4LV2"
+ *
+ * @param obj   A webcam object.
+ *
+ * Returns: a string if successfull, NULL otherwise.
+ */
+MS2_PUBLIC const char *ms_web_cam_get_driver_type(const MSWebCam *obj);
+
+/**
+ * Retreive a webcam's name.
+ *
+ * @param obj   A webcam object.
+ *
+ * Returns: a string if successfull, NULL otherwise.
+ */
+MS2_PUBLIC const char *ms_web_cam_get_name(const MSWebCam *obj);
+
+/**
+ * Retreive webcam's id: ($driver_type: $name).
+ *
+ * @param obj    A webcam object.
+ *
+ * Returns: A string if successfull, NULL otherwise.
+ */
+MS2_PUBLIC const char *ms_web_cam_get_string_id(MSWebCam *obj);
+
+
+/*specific methods for static image:*/
+
+MS2_PUBLIC void ms_static_image_set_default_image(const char *path);
+MS2_PUBLIC const char *ms_static_image_get_default_image(void);
+
+/** method for the "nowebcam" filter */
+#define MS_STATIC_IMAGE_SET_IMAGE \
+	MS_FILTER_METHOD(MS_STATIC_IMAGE_ID,0,const char)
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/qualityindicator.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/qualityindicator.h"
new file mode 100755
index 0000000..6ef973a
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/qualityindicator.h"
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ms2_qualityindicator_h
+#define ms2_qualityindicator_h
+
+#include "mediastreamer2/mscommon.h"
+#include <ortp/ortp.h>
+
+typedef struct _MSQualityIndicator MSQualityIndicator;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/**
+ * Creates a quality indicator object.
+ * @param session the RtpSession being monitored.
+**/ 
+MS2_PUBLIC MSQualityIndicator *ms_quality_indicator_new(RtpSession *session);
+
+/**
+ * Set a label, just used for logging.
+**/
+MS2_PUBLIC void ms_quality_indicator_set_label(MSQualityIndicator *obj, const char *label);
+
+/**
+ * Updates quality indicator based on a received RTCP packet.
+**/
+MS2_PUBLIC void ms_quality_indicator_update_from_feedback(MSQualityIndicator *qi, mblk_t *rtcp);
+
+/**
+ * Updates quality indicator based on the local statistics directly computed by the RtpSession used when creating the indicator.
+ * This function must be called typically every second.
+**/
+MS2_PUBLIC void ms_quality_indicator_update_local(MSQualityIndicator *qi);
+
+/**
+ * Return the real time rating of the session. Its value is between 0 (worse) and 5.0 (best).
+**/
+MS2_PUBLIC float ms_quality_indicator_get_rating(const MSQualityIndicator *qi);
+
+/**
+ * Returns the average rating of the session, that is the rating for all the duration of the session.
+**/
+MS2_PUBLIC float ms_quality_indicator_get_average_rating(const MSQualityIndicator *qi);
+
+/**
+ * Return the real time rating of the listening quality of the session. Its value is between 0.0 (worse) and 5.0 (best).
+**/
+MS2_PUBLIC float ms_quality_indicator_get_lq_rating(const MSQualityIndicator *qi);
+
+/**
+ * Returns the average rating of the listening quality of the session, that is the rating of the listening quality for all the duration of the session.
+**/
+MS2_PUBLIC float ms_quality_indicator_get_average_lq_rating(const MSQualityIndicator *qi);
+
+/**
+ * Returns the local loss rate, as computed internally by ms_quality_indicator_update_local().
+ * The value is expressed as a percentage.
+ * This method is for advanced usage.
+**/
+MS2_PUBLIC float ms_quality_indicator_get_local_loss_rate(const MSQualityIndicator *qi);
+
+/**
+ * Returns the local late rate, as computed internally by ms_quality_indicator_update_local().
+ * The value is expressed as a percentage.
+ * This method is for advanced usage.
+**/
+MS2_PUBLIC float ms_quality_indicator_get_local_late_rate(const MSQualityIndicator *qi);
+
+/**
+ * Destroys the quality indicator object.
+**/
+MS2_PUBLIC void ms_quality_indicator_destroy(MSQualityIndicator *qi);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/rfc3984.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/rfc3984.h"
new file mode 100755
index 0000000..96ba643
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/rfc3984.h"
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef rfc3984_h
+#define rfc3984_h
+
+#include <mediastreamer2/mscommon.h>
+#include <mediastreamer2/msqueue.h>
+#include <mediastreamer2/msfactory.h>
+/*
+This file declares an API useful to pack/unpack H264 nals as described in RFC3984
+It is part of the public API to allow external H264 plugins use this api.
+*/
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+typedef enum{
+	Rfc3984FrameAvailable = 1,
+	Rfc3984FrameCorrupted = 1<<1,
+	Rfc3984IsKeyFrame = 1<<2, /*set when a frame has SPS + PPS or IDR (possibly both)*/
+	Rfc3984NewSPS = 1<<3,
+	Rfc3984NewPPS = 1<<4,
+	Rfc3984HasSPS = 1<<5,
+	Rfc3984HasPPS = 1<<6,
+	Rfc3984HasIDR = 1<<7
+}Rfc3984Status;
+
+typedef struct _Rfc3984Context Rfc3984Context;
+
+MS2_DEPRECATED MS2_PUBLIC Rfc3984Context *rfc3984_new(void);
+MS2_PUBLIC Rfc3984Context *rfc3984_new_with_factory(MSFactory *factory);
+
+MS2_PUBLIC void rfc3984_destroy(Rfc3984Context *ctx);
+
+
+MS2_PUBLIC void rfc3984_set_mode(Rfc3984Context *ctx, int mode);
+
+/* some stupid phones don't decode STAP-A packets ...*/
+MS2_PUBLIC void rfc3984_enable_stap_a(Rfc3984Context *ctx, bool_t yesno);
+
+/*process NALUs and pack them into rtp payloads */
+MS2_PUBLIC void rfc3984_pack(Rfc3984Context *ctx, MSQueue *naluq, MSQueue *rtpq, uint32_t ts);
+
+
+MS2_PUBLIC void rfc3984_unpack_out_of_band_sps_pps(Rfc3984Context *ctx, mblk_t *sps, mblk_t *pps);
+
+/**
+ * Process incoming rtp data and output NALUs, whenever possible.
+ * @param ctx the Rfc3984Context object
+ * @param im a new H264 packet to process
+ * @param naluq a MSQueue into which a frame ready to be decoded will be output, in the form of a sequence of NAL units.
+ * @return a bitmask of Rfc3984Status values.
+ * The return value is a bitmask of the #Rfc3984Status enum.
+**/
+MS2_PUBLIC unsigned int rfc3984_unpack2(Rfc3984Context *ctx, mblk_t *im, MSQueue *naluq);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/stun.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/stun.h"
new file mode 100755
index 0000000..4432949
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/stun.h"
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MS_STUN_H
+#define MS_STUN_H
+
+
+#include <ortp/rtpsession.h>
+#include <mediastreamer2/mscommon.h>
+
+
+#define MS_STUN_MAX_MESSAGE_SIZE 2048
+#define MS_STUN_MAGIC_COOKIE 0x2112A442
+
+#define MS_STUN_ADDR_FAMILY_IPV4 0x01
+#define MS_STUN_ADDR_FAMILY_IPV6 0x02
+
+#define MS_STUN_TYPE_REQUEST          0x0000
+#define MS_STUN_TYPE_INDICATION       0x0010
+#define MS_STUN_TYPE_SUCCESS_RESPONSE 0x0100
+#define MS_STUN_TYPE_ERROR_RESPONSE   0x0110
+
+#define MS_STUN_METHOD_BINDING           0x001
+#define MS_STUN_METHOD_SHARED_SECRET     0x002 /* Deprecated, now reserved */
+
+#define MS_TURN_METHOD_ALLOCATE          0x003
+#define MS_TURN_METHOD_REFRESH           0x004
+#define MS_TURN_METHOD_SEND              0x006
+#define MS_TURN_METHOD_DATA              0x007
+#define MS_TURN_METHOD_CREATE_PERMISSION 0x008
+#define MS_TURN_METHOD_CHANNEL_BIND      0x009
+
+
+#define MS_STUN_ATTR_MAPPED_ADDRESS           0x0001
+#define MS_STUN_ATTR_RESPONSE_ADDRESS         0x0002 /* Deprecated, now reserved */
+#define MS_STUN_ATTR_CHANGE_REQUEST           0x0003 /* Deprecated, now reserved */
+#define MS_STUN_ATTR_SOURCE_ADDRESS           0x0004 /* Deprecated, now reserved */
+#define MS_STUN_ATTR_CHANGED_ADDRESS          0x0005 /* Deprecated, now reserved */
+#define MS_STUN_ATTR_USERNAME                 0x0006
+#define MS_STUN_ATTR_PASSWORD                 0x0007 /* Deprecated, now reserved */
+#define MS_STUN_ATTR_MESSAGE_INTEGRITY        0x0008
+#define MS_STUN_ATTR_ERROR_CODE               0x0009
+#define MS_STUN_ATTR_UNKNOWN_ATTRIBUTES       0x000A
+#define MS_STUN_ATTR_REFLECTED_FROM           0x000B
+#define MS_STUN_ATTR_REALM                    0x0014
+#define MS_STUN_ATTR_NONCE                    0x0015
+#define MS_STUN_ATTR_XOR_MAPPED_ADDRESS       0x0020
+
+#define MS_STUN_ATTR_SOFTWARE                 0x8022
+#define MS_STUN_ATTR_ALTERNATE_SERVER         0x8023
+#define MS_STUN_ATTR_FINGERPRINT              0x8028
+
+#define MS_TURN_ATTR_CHANNEL_NUMBER           0x000C
+#define MS_TURN_ATTR_LIFETIME                 0x000D
+#define MS_TURN_ATTR_BANDWIDTH                0x0010 /* Deprecated, now reserved */
+#define MS_TURN_ATTR_XOR_PEER_ADDRESS         0x0012
+#define MS_TURN_ATTR_DATA                     0x0013
+#define MS_TURN_ATTR_XOR_RELAYED_ADDRESS      0x0016
+#define MS_TURN_ATTR_REQUESTED_ADDRESS_FAMILY 0x0017
+#define MS_TURN_ATTR_EVEN_PORT                0x0018
+#define MS_TURN_ATTR_REQUESTED_TRANSPORT      0x0019
+#define MS_TURN_ATTR_DONT_FRAGMENT            0x001A
+#define MS_TURN_ATTR_TIMER_VAL                0x0021 /* Deprecated, now reserved */
+#define MS_TURN_ATTR_RESERVATION_TOKEN        0x0022
+
+#define MS_ICE_ATTR_PRIORITY                  0x0024
+#define MS_ICE_ATTR_USE_CANDIDATE             0x0025
+#define MS_ICE_ATTR_ICE_CONTROLLED            0x8029
+#define MS_ICE_ATTR_ICE_CONTROLLING           0x802A
+
+
+#define MS_STUN_ERROR_CODE_TRY_ALTERNATE                  300
+#define MS_STUN_ERROR_CODE_BAD_REQUEST                    400
+#define MS_STUN_ERROR_CODE_UNAUTHORIZED                   401
+#define MS_STUN_ERROR_CODE_UNKNOWN_ATTRIBUTE              420
+#define MS_STUN_ERROR_CODE_STALE_NONCE                    438
+#define MS_STUN_ERROR_CODE_SERVER_ERROR                   500
+
+#define MS_TURN_ERROR_CODE_FORBIDDEN                      403
+#define MS_TURN_ERROR_CODE_ALLOCATION_MISMATCH            437
+#define MS_TURN_ERROR_CODE_WRONG_CREDENTIALS              441
+#define MS_TURN_ERROR_CODE_UNSUPPORTED_TRANSPORT_PROTOCOL 442
+#define MS_TURN_ERROR_CODE_ALLOCATION_QUOTA_REACHED       486
+#define MS_TURN_ERROR_CODE_INSUFFICIENT_CAPACITY          508
+
+#define MS_ICE_ERROR_CODE_ROLE_CONFLICT                   487
+
+
+typedef struct {
+	uint16_t port;
+	uint32_t addr;
+} MSStunAddress4;
+
+typedef struct {
+	uint16_t port;
+	UInt128 addr;
+} MSStunAddress6;
+
+typedef struct {
+	union {
+		MSStunAddress4 v4;
+		MSStunAddress6 v6;
+	} ip;
+	uint8_t family;
+} MSStunAddress;
+
+typedef struct {
+	char *reason;
+	uint16_t number;
+} MSStunErrorCode;
+
+typedef struct {
+	uint16_t type;
+	uint16_t method;
+	uint16_t length;
+	UInt96 tr_id;
+	uint8_t *data;
+	char *username;
+	char *password;
+	char *ha1;
+	char *realm;
+	char *message_integrity;
+	char *software;
+	char *nonce;
+	MSStunErrorCode error_code;
+	MSStunAddress mapped_address;
+	MSStunAddress xor_mapped_address;
+	MSStunAddress xor_peer_address;
+	MSStunAddress xor_relayed_address;
+	uint32_t change_request;
+	uint32_t fingerprint;
+	uint32_t priority;
+	uint64_t ice_controlling;
+	uint64_t ice_controlled;
+	uint32_t lifetime;
+	uint16_t channel_number;
+	uint16_t data_length;
+	uint8_t requested_transport;
+	uint8_t requested_address_family;
+	bool_t include_username_attribute;
+	bool_t has_error_code;
+	bool_t has_message_integrity;
+	bool_t has_dummy_message_integrity;
+	bool_t has_fingerprint;
+	bool_t has_mapped_address;
+	bool_t has_xor_mapped_address;
+	bool_t has_xor_peer_address;
+	bool_t has_xor_relayed_address;
+	bool_t has_priority;
+	bool_t has_use_candidate;
+	bool_t has_ice_controlling;
+	bool_t has_ice_controlled;
+	bool_t has_lifetime;
+	bool_t has_channel_number;
+	bool_t has_requested_transport;
+	bool_t has_requested_address_family;
+} MSStunMessage;
+
+typedef enum {
+	MS_TURN_CONTEXT_STATE_IDLE,
+	MS_TURN_CONTEXT_STATE_CREATING_ALLOCATION,
+	MS_TURN_CONTEXT_STATE_ALLOCATION_CREATED,
+	MS_TURN_CONTEXT_STATE_CREATING_PERMISSIONS,
+	MS_TURN_CONTEXT_STATE_PERMISSIONS_CREATED,
+	MS_TURN_CONTEXT_STATE_BINDING_CHANNEL,
+	MS_TURN_CONTEXT_STATE_CHANNEL_BOUND
+} MSTurnContextState;
+
+typedef enum {
+	MS_TURN_CONTEXT_TYPE_RTP,
+	MS_TURN_CONTEXT_TYPE_RTCP
+} MSTurnContextType;
+
+typedef struct {
+	uint32_t nb_send_indication;
+	uint32_t nb_data_indication;
+	uint32_t nb_received_channel_msg;
+	uint32_t nb_sent_channel_msg;
+	uint16_t nb_successful_allocate;
+	uint16_t nb_successful_refresh;
+	uint16_t nb_successful_create_permission;
+	uint16_t nb_successful_channel_bind;
+} MSTurnContextStatistics;
+
+typedef struct {
+	RtpSession *rtp_session;
+	RtpTransport *endpoint;
+	MSList *allowed_peer_addresses;
+	char *realm;
+	char *nonce;
+	char *username;
+	char *password;
+	char *ha1;
+	uint32_t lifetime;
+	uint16_t channel_number;
+	MSTurnContextState state;
+	MSTurnContextType type;
+	MSStunAddress relay_addr;
+	struct sockaddr_storage turn_server_addr;
+	socklen_t turn_server_addrlen;
+	bool_t force_rtp_sending_via_relay;
+	MSTurnContextStatistics stats;
+} MSTurnContext;
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef void (*MSStunAuthRequestedCb)(void *userdata, const char *realm, const char *nonce, const char **username, const char **password, const char **ha1);
+
+
+MS2_PUBLIC bool_t ms_compare_stun_addresses(const MSStunAddress *a1, const MSStunAddress *a2);
+MS2_PUBLIC int ms_stun_family_to_af(int stun_family);
+MS2_PUBLIC void ms_stun_address_to_sockaddr(const MSStunAddress *stun_addr, struct sockaddr *addr, socklen_t *addrlen);
+MS2_PUBLIC void ms_sockaddr_to_stun_address(const struct sockaddr *addr, MSStunAddress *stun_addr);
+MS2_PUBLIC MSStunAddress ms_ip_address_to_stun_address(int ai_family, int socktype, const char *hostname, int port);
+MS2_PUBLIC void ms_stun_address_to_ip_address(const MSStunAddress *stun_address, char *ip, size_t ip_size, int *port);
+MS2_PUBLIC void ms_stun_address_to_printable_ip_address(const MSStunAddress *stun_address, char *printable_ip, size_t printable_ip_size);
+MS2_PUBLIC char * ms_stun_calculate_integrity_short_term(const char *buf, size_t bufsize, const char *key);
+MS2_PUBLIC char * ms_stun_calculate_integrity_long_term(const char *buf, size_t bufsize, const char *realm, const char *username, const char *password);
+MS2_PUBLIC char * ms_stun_calculate_integrity_long_term_from_ha1(const char *buf, size_t bufsize, const char *ha1_text);
+MS2_PUBLIC uint32_t ms_stun_calculate_fingerprint(const char *buf, size_t bufsize);
+
+MS2_PUBLIC MSStunMessage * ms_stun_message_create(uint16_t type, uint16_t method);
+MS2_PUBLIC MSStunMessage * ms_stun_message_create_from_buffer_parsing(const uint8_t *buf, ssize_t bufsize);
+MS2_PUBLIC MSStunMessage * ms_stun_binding_request_create(void);
+MS2_PUBLIC MSStunMessage * ms_stun_binding_success_response_create(void);
+MS2_PUBLIC MSStunMessage * ms_stun_binding_error_response_create(void);
+MS2_PUBLIC MSStunMessage * ms_stun_binding_indication_create(void);
+MS2_PUBLIC bool_t ms_stun_message_is_request(const MSStunMessage *msg);
+MS2_PUBLIC bool_t ms_stun_message_is_success_response(const MSStunMessage *msg);
+MS2_PUBLIC bool_t ms_stun_message_is_error_response(const MSStunMessage *msg);
+MS2_PUBLIC bool_t ms_stun_message_is_indication(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_destroy(MSStunMessage *msg);
+MS2_PUBLIC size_t ms_stun_message_encode(const MSStunMessage *msg, char **buf);
+MS2_PUBLIC uint16_t ms_stun_message_get_method(const MSStunMessage *msg);
+MS2_PUBLIC uint16_t ms_stun_message_get_length(const MSStunMessage *msg);
+MS2_PUBLIC UInt96 ms_stun_message_get_tr_id(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_tr_id(MSStunMessage *msg, UInt96 tr_id);
+MS2_PUBLIC void ms_stun_message_set_random_tr_id(MSStunMessage *msg);
+MS2_PUBLIC const char * ms_stun_message_get_username(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_username(MSStunMessage *msg, const char *username);
+MS2_PUBLIC void ms_stun_message_include_username_attribute(MSStunMessage *msg, bool_t include);
+MS2_PUBLIC const char * ms_stun_message_get_password(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_password(MSStunMessage *msg, const char *password);
+MS2_PUBLIC void ms_stun_message_set_ha1(MSStunMessage *msg, const char *ha1_text);
+MS2_PUBLIC const char * ms_stun_message_get_realm(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_realm(MSStunMessage *msg, const char *realm);
+MS2_PUBLIC const char * ms_stun_message_get_software(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_software(MSStunMessage *msg, const char *software);
+MS2_PUBLIC const char * ms_stun_message_get_nonce(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_nonce(MSStunMessage *msg, const char *nonce);
+MS2_PUBLIC bool_t ms_stun_message_has_error_code(const MSStunMessage *msg);
+MS2_PUBLIC uint16_t ms_stun_message_get_error_code(const MSStunMessage *msg, char **reason);
+MS2_PUBLIC void ms_stun_message_set_error_code(MSStunMessage *msg, uint16_t number, const char *reason);
+MS2_PUBLIC bool_t ms_stun_message_message_integrity_enabled(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_enable_message_integrity(MSStunMessage *msg, bool_t enable);
+MS2_PUBLIC const char * ms_stun_message_get_message_integrity(const MSStunMessage *msg);
+MS2_PUBLIC bool_t ms_stun_message_fingerprint_enabled(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_enable_fingerprint(MSStunMessage *msg, bool_t enable);
+MS2_PUBLIC const MSStunAddress * ms_stun_message_get_mapped_address(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_mapped_address(MSStunMessage *msg, MSStunAddress mapped_address);
+MS2_PUBLIC const MSStunAddress * ms_stun_message_get_xor_mapped_address(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_xor_mapped_address(MSStunMessage *msg, MSStunAddress xor_mapped_address);
+MS2_PUBLIC const MSStunAddress * ms_stun_message_get_xor_peer_address(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_xor_peer_address(MSStunMessage *msg, MSStunAddress xor_peer_address);
+MS2_PUBLIC const MSStunAddress * ms_stun_message_get_xor_relayed_address(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_xor_relayed_address(MSStunMessage *msg, MSStunAddress xor_relayed_address);
+MS2_PUBLIC void ms_stun_message_enable_change_ip(MSStunMessage *msg, bool_t enable);
+MS2_PUBLIC void ms_stun_message_enable_change_port(MSStunMessage *msg, bool_t enable);
+
+MS2_PUBLIC bool_t ms_stun_message_has_priority(const MSStunMessage *msg);
+MS2_PUBLIC uint32_t ms_stun_message_get_priority(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_priority(MSStunMessage *msg, uint32_t priority);
+MS2_PUBLIC bool_t ms_stun_message_use_candidate_enabled(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_enable_use_candidate(MSStunMessage *msg, bool_t enable);
+MS2_PUBLIC bool_t ms_stun_message_has_ice_controlling(const MSStunMessage *msg);
+MS2_PUBLIC uint64_t ms_stun_message_get_ice_controlling(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_ice_controlling(MSStunMessage *msg, uint64_t value);
+MS2_PUBLIC bool_t ms_stun_message_has_ice_controlled(const MSStunMessage *msg);
+MS2_PUBLIC uint64_t ms_stun_message_get_ice_controlled(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_ice_controlled(MSStunMessage *msg, uint64_t value);
+
+MS2_PUBLIC bool_t ms_stun_message_dummy_message_integrity_enabled(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_enable_dummy_message_integrity(MSStunMessage *msg, bool_t enable);
+
+MS2_PUBLIC MSStunMessage * ms_turn_allocate_request_create(void);
+MS2_PUBLIC MSStunMessage * ms_turn_refresh_request_create(uint32_t lifetime);
+MS2_PUBLIC MSStunMessage * ms_turn_create_permission_request_create(MSStunAddress peer_address);
+MS2_PUBLIC MSStunMessage * ms_turn_send_indication_create(MSStunAddress peer_address);
+MS2_PUBLIC MSStunMessage * ms_turn_channel_bind_request_create(MSStunAddress peer_address, uint16_t channel_number);
+MS2_PUBLIC bool_t ms_stun_message_has_requested_transport(const MSStunMessage *msg);
+MS2_PUBLIC uint8_t ms_stun_message_get_requested_transport(const MSStunMessage *msg);
+MS2_PUBLIC bool_t ms_stun_message_has_requested_address_family(const MSStunMessage *msg);
+MS2_PUBLIC uint8_t ms_stun_message_get_requested_address_family(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_requested_address_family(MSStunMessage *msg, uint8_t family);
+MS2_PUBLIC bool_t ms_stun_message_has_lifetime(const MSStunMessage *msg);
+MS2_PUBLIC uint32_t ms_stun_message_get_lifetime(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_lifetime(MSStunMessage *msg, uint32_t lifetime);
+MS2_PUBLIC bool_t ms_stun_message_has_channel_number(const MSStunMessage *msg);
+MS2_PUBLIC uint16_t ms_stun_message_get_channel_number(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_channel_number(MSStunMessage *msg, uint16_t channel_number);
+MS2_PUBLIC uint8_t * ms_stun_message_get_data(const MSStunMessage *msg);
+MS2_PUBLIC uint16_t ms_stun_message_get_data_length(const MSStunMessage *msg);
+MS2_PUBLIC void ms_stun_message_set_data(MSStunMessage *msg, uint8_t *data, uint16_t length);
+
+MS2_PUBLIC MSTurnContext * ms_turn_context_new(MSTurnContextType type, RtpSession *rtp_session);
+MS2_PUBLIC void ms_turn_context_destroy(MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_server_addr(MSTurnContext *context, struct sockaddr *addr, socklen_t addrlen);
+MS2_PUBLIC MSTurnContextState ms_turn_context_get_state(const MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_state(MSTurnContext *context, MSTurnContextState state);
+MS2_PUBLIC const char * ms_turn_context_get_realm(const MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_realm(MSTurnContext *context, const char *realm);
+MS2_PUBLIC const char * ms_turn_context_get_nonce(const MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_nonce(MSTurnContext *context, const char *nonce);
+MS2_PUBLIC const char * ms_turn_context_get_username(const MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_username(MSTurnContext *context, const char *username);
+MS2_PUBLIC const char * ms_turn_context_get_password(const MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_password(MSTurnContext *context, const char *password);
+MS2_PUBLIC const char * ms_turn_context_get_ha1(const MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_ha1(MSTurnContext *context, const char *ha1);
+MS2_PUBLIC uint32_t ms_turn_context_get_lifetime(const MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_lifetime(MSTurnContext *context, uint32_t lifetime);
+MS2_PUBLIC uint16_t ms_turn_context_get_channel_number(const MSTurnContext *context);
+MS2_PUBLIC void ms_turn_context_set_channel_number(MSTurnContext *context, uint16_t channel_number);
+MS2_PUBLIC void ms_turn_context_set_allocated_relay_addr(MSTurnContext *context, MSStunAddress relay_addr);
+MS2_PUBLIC void ms_turn_context_set_force_rtp_sending_via_relay(MSTurnContext *context, bool_t force);
+MS2_PUBLIC bool_t ms_turn_context_peer_address_allowed(const MSTurnContext *context, const MSStunAddress *peer_address);
+MS2_PUBLIC void ms_turn_context_allow_peer_address(MSTurnContext *context, const MSStunAddress *peer_address);
+MS2_PUBLIC RtpTransport * ms_turn_context_create_endpoint(MSTurnContext *context);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MS_STUN_H */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/upnp_igd.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/upnp_igd.h"
new file mode 100755
index 0000000..ceacd0b
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/upnp_igd.h"
@@ -0,0 +1,96 @@
+/*
+mediastreamer2 library - modular sound and video processing and streaming
+Copyright (C) 2012  Belledonne Communications
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+*/
+
+#ifndef _UPNP_IGD_H__
+#define _UPNP_IGD_H__
+
+#include <stdarg.h>
+
+#if defined(_MSC_VER)
+#define MS2_PUBLIC	__declspec(dllexport)
+#else
+#define MS2_PUBLIC
+#endif
+
+typedef enum _upnp_igd_print_level {
+	UPNP_IGD_DEBUG = 0,
+	UPNP_IGD_MESSAGE,
+	UPNP_IGD_WARNING,
+	UPNP_IGD_ERROR
+} upnp_igd_print_level;
+
+typedef enum _upnp_igd_ip_protocol {
+	UPNP_IGD_IP_PROTOCOL_UDP = 0,
+	UPNP_IGD_IP_PROTOCOL_TCP
+} upnp_igd_ip_protocol;
+
+typedef enum _upnp_igd_event {
+	UPNP_IGD_EXTERNAL_IPADDRESS_CHANGED = 0,
+	UPNP_IGD_NAT_ENABLED_CHANGED,
+	UPNP_IGD_CONNECTION_STATUS_CHANGED,
+	UPNP_IGD_PORT_MAPPING_ADD_SUCCESS,
+	UPNP_IGD_PORT_MAPPING_ADD_FAILURE,
+	UPNP_IGD_PORT_MAPPING_REMOVE_SUCCESS,
+	UPNP_IGD_PORT_MAPPING_REMOVE_FAILURE,
+	UPNP_IGD_DEVICE_ADDED = 100,
+	UPNP_IGD_DEVICE_REMOVED,
+} upnp_igd_event;
+
+typedef struct _upnp_igd_port_mapping {
+	upnp_igd_ip_protocol protocol;
+
+	const char* local_host;
+	int local_port;
+
+	const char* remote_host;
+	int remote_port;
+
+	const char* description;
+
+	void *cookie;
+	int retvalue;
+} upnp_igd_port_mapping;
+
+typedef void (*upnp_igd_callback_function)(void *cookie, upnp_igd_event event, void *arg);
+typedef void (*upnp_igd_print_function)(void *cookie, upnp_igd_print_level level, const char *fmt, va_list list);
+
+typedef struct _upnp_igd_context upnp_igd_context;
+
+MS2_PUBLIC upnp_igd_context* upnp_igd_create(upnp_igd_callback_function cb_fct, upnp_igd_print_function print_fct, const char* address, void *cookie);
+MS2_PUBLIC int upnp_igd_start(upnp_igd_context*igd_ctxt);
+int upnp_igd_is_started(upnp_igd_context *igd_ctxt);
+int upnp_igd_stop(upnp_igd_context*igd_ctxt);
+MS2_PUBLIC void upnp_igd_destroy(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC char *upnp_igd_get_local_ipaddress(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC const char *upnp_igd_get_device_id(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC const char *upnp_igd_get_device_name(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC const char *upnp_igd_get_device_model_name(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC const char *upnp_igd_get_device_model_number(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC const char *upnp_igd_get_external_ipaddress(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC const char *upnp_igd_get_connection_status(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC int upnp_igd_get_nat_enabled(upnp_igd_context *igd_ctxt);
+
+MS2_PUBLIC int upnp_igd_add_port_mapping(upnp_igd_context *igd_ctxt, const upnp_igd_port_mapping *mapping);
+MS2_PUBLIC int upnp_igd_delete_port_mapping(upnp_igd_context *igd_ctxt, const upnp_igd_port_mapping *mapping);
+
+MS2_PUBLIC int upnp_igd_refresh(upnp_igd_context *igd_ctxt);
+MS2_PUBLIC void upnp_igd_set_devices_timeout(upnp_igd_context *igd_ctxt, int seconds);
+MS2_PUBLIC int upnp_igd_get_devices_timeout(upnp_igd_context *igd_ctxt);
+
+#endif //_UPNP_IGD_H__
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/x11_helper.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/x11_helper.h"
new file mode 100755
index 0000000..889b6f6
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/x11_helper.h"
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#if !defined(_X11_HELPER_H_)
+#define _X11_HELPER_H_
+
+#ifdef HAVE_X11_XLIB_H
+
+#include <X11/Xlib.h>
+
+typedef struct _x11_helper {
+	Display *display;
+	Window window;
+} MSX11Helper;
+
+/* One time init */
+int ms_x11_helper_init(MSX11Helper* x11);
+
+int ms_x11_helper_create_window(MSX11Helper* x11, int width, int height);
+
+int ms_x11_helper_get_window_size(MSX11Helper* x11, int* width, int* height);
+
+int ms_x11_helper_destroy_window(MSX11Helper* x11);
+
+int ms_x11_helper_uninit(MSX11Helper* x11);
+
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/zrtp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/zrtp.h"
new file mode 100755
index 0000000..3176ba9
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Headers/zrtp.h"
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of mediastreamer2.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ms_zrtp_h
+#define ms_zrtp_h
+
+#include <ortp/rtpsession.h>
+#include "mediastreamer2/mscommon.h"
+#include <bctoolbox/port.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/* defined in mediastream.h */
+struct _MSMediaStreamSessions;
+
+
+/* Error codes */
+#define MSZRTP_ERROR_CHANNEL_ALREADY_STARTED		-0x0001
+
+#define MS_MAX_ZRTP_CRYPTO_TYPES 7
+
+/* cache related function return codes */
+#define MSZRTP_CACHE_ERROR		-0x1000
+#define MSZRTP_CACHE_SETUP		0x2000
+#define MSZRTP_CACHE_UPDATE		0x2001
+#define MSZRTP_ERROR_CACHEDISABLED				-0x0200
+#define MSZRTP_ERROR_CACHEMIGRATIONFAILED			-0x0400
+
+
+
+typedef uint8_t MsZrtpCryptoTypesCount;
+
+typedef enum _MSZrtpHash{
+	MS_ZRTP_HASH_INVALID,
+	MS_ZRTP_HASH_S256,
+	MS_ZRTP_HASH_S384,
+	MS_ZRTP_HASH_N256,
+	MS_ZRTP_HASH_N384
+} MSZrtpHash;
+
+typedef enum _MSZrtpCipher{
+	MS_ZRTP_CIPHER_INVALID,
+	MS_ZRTP_CIPHER_AES1,
+	MS_ZRTP_CIPHER_AES2,
+	MS_ZRTP_CIPHER_AES3,
+	MS_ZRTP_CIPHER_2FS1,
+	MS_ZRTP_CIPHER_2FS2,
+	MS_ZRTP_CIPHER_2FS3
+} MSZrtpCipher;
+
+typedef enum _MSZrtpAuthTag{
+	MS_ZRTP_AUTHTAG_INVALID,
+	MS_ZRTP_AUTHTAG_HS32,
+	MS_ZRTP_AUTHTAG_HS80,
+	MS_ZRTP_AUTHTAG_SK32,
+	MS_ZRTP_AUTHTAG_SK64
+} MSZrtpAuthTag;
+
+typedef enum _MSZrtpKeyAgreement{
+	MS_ZRTP_KEY_AGREEMENT_INVALID,
+	MS_ZRTP_KEY_AGREEMENT_DH2K,
+	MS_ZRTP_KEY_AGREEMENT_DH3K,
+	MS_ZRTP_KEY_AGREEMENT_EC25,
+	MS_ZRTP_KEY_AGREEMENT_EC38,
+	MS_ZRTP_KEY_AGREEMENT_EC52,
+	MS_ZRTP_KEY_AGREEMENT_X255,
+	MS_ZRTP_KEY_AGREEMENT_X448
+} MSZrtpKeyAgreement;
+
+typedef enum _MSZrtpSasType{
+	MS_ZRTP_SAS_INVALID,
+	MS_ZRTP_SAS_B32,
+	MS_ZRTP_SAS_B256
+} MSZrtpSasType;
+
+typedef enum _MSZrtpPeerStatus{
+	MS_ZRTP_PEER_STATUS_UNKNOWN,
+	MS_ZRTP_PEER_STATUS_INVALID,
+	MS_ZRTP_PEER_STATUS_VALID
+} MSZrtpPeerStatus;
+
+typedef struct MSZrtpParams {
+	void *zidCacheDB; /**< a pointer to an sqlite database holding all zrtp related information */
+	bctbx_mutex_t *zidCacheDBMutex; /**< pointer to a mutex used to lock cache access */
+	const char *selfUri; /* our sip URI, needed for zrtp Cache */
+	const char *peerUri; /* the sip URI of correspondant, needed for zrtp Cache */
+	uint32_t limeKeyTimeSpan; /**< amount in seconds of the lime key life span, set to 0 for infinite life span **/
+	bool_t autoStart; /*allow zrtp to start on first hello packet received*/
+
+	/* activated crypto types */
+	MSZrtpHash             hashes[MS_MAX_ZRTP_CRYPTO_TYPES];
+	MsZrtpCryptoTypesCount hashesCount ;
+	MSZrtpCipher           ciphers[MS_MAX_ZRTP_CRYPTO_TYPES];
+	MsZrtpCryptoTypesCount ciphersCount;
+	MSZrtpAuthTag          authTags[MS_MAX_ZRTP_CRYPTO_TYPES];
+	MsZrtpCryptoTypesCount authTagsCount;
+	MSZrtpKeyAgreement     keyAgreements[MS_MAX_ZRTP_CRYPTO_TYPES];
+	MsZrtpCryptoTypesCount keyAgreementsCount;
+	MSZrtpSasType          sasTypes[MS_MAX_ZRTP_CRYPTO_TYPES];
+	MsZrtpCryptoTypesCount sasTypesCount;
+} MSZrtpParams;
+
+typedef struct _MSZrtpContext MSZrtpContext ;
+
+/**
+ * check if ZRTP is available
+ * @return	TRUE if it is available, FALSE if not
+ */
+MS2_PUBLIC bool_t ms_zrtp_available(void);
+
+/**
+ * Create an initialise a ZRTP context
+ * @param[in]	stream_sessions		A link to the stream sessions structures, used to get rtp session to add transport modifier and needed to set SRTP sessions when keys are ready
+ * @param[in]	params			ZID cache filename and peer sip uri
+ * @return	a pointer to the opaque context structure needed by MSZRTP
+ */
+MS2_PUBLIC MSZrtpContext* ms_zrtp_context_new(struct _MSMediaStreamSessions *stream_sessions, MSZrtpParams *params);
+
+/**
+ * Create an initialise a ZRTP context on a channel when a ZRTP exchange was already performed on an other one
+ * @param[in]	stream_sessions		A link to the stream sessions structures, used to get rtp session to add transport modifier and needed to set SRTP sessions when keys are ready
+ * @param[in]	activeContext		The MSZRTP context of the already active session, used to pass to lib bzrtp its own context which shall remain unique.
+ * @return	a pointer to the opaque context structure needed by MSZRTP
+ */
+MS2_PUBLIC MSZrtpContext* ms_zrtp_multistream_new(struct _MSMediaStreamSessions *stream_sessions, MSZrtpContext* activeContext);
+
+/**
+ * Start a previously created ZRTP channel, ZRTP engine will start sending Hello packets
+ * @param[in]	ctx		Context previously created using ms_zrtp_context_new or ms_zrtp_multistream_new
+ * @return	0 on success
+ */
+MS2_PUBLIC int ms_zrtp_channel_start(MSZrtpContext *ctx);
+
+/**
+ * Free ressources used by ZRTP context
+ * it will also free the libbzrtp context if no more channel are active
+ * @param[in/out]	context		the opaque MSZRTP context
+ */
+MS2_PUBLIC void ms_zrtp_context_destroy(MSZrtpContext *ctx);
+
+/**
+ * Can be used to give more time for establishing zrtp session
+ * @param[in] ctx	The MSZRTP context
+ * */
+MS2_PUBLIC void ms_zrtp_reset_transmition_timer(MSZrtpContext* ctx);
+
+/**
+ * Tell the MSZRTP context that SAS was controlled by user, it will trigger a ZID cache update
+ * @param[in]	ctx	MSZRTP context, used to retrieve cache and update it
+ */
+MS2_PUBLIC void ms_zrtp_sas_verified(MSZrtpContext* ctx);
+
+/**
+ * Tell the MSZRTP context that user have requested the SAS verified status to be reseted, it will trigger a ZID cache update
+ * @param[in]	ctx	MSZRTP context, used to retrieve cache and update it
+ */
+MS2_PUBLIC void ms_zrtp_sas_reset_verified(MSZrtpContext* ctx);
+
+/**
+ * Get the zrtp sas validation status for a peer uri.
+ * Once the SAS has been validated or rejected, the status will never return to UNKNOWN (unless you delete your cache)
+ * @param[in/out]	db	Pointer to the sqlite3 db open connection
+ * 				Use a void * to keep this API when building cacheless
+ * @param[in]		peerUri	the sip uri of the peer device we're querying status
+ * @param[in]		dbMutex	a mutex to synchronise zrtp cache database operation. Ignored if NULL
+ *
+ * @return  - MS_ZRTP_PEER_STATUS_UNKNOWN: this uri is not present in cache OR during calls with the active device, SAS never was validated or rejected
+ *  		- MS_ZRTP_PEER_STATUS_INVALID: the active device status is set to valid
+ *  		- MS_ZRTP_PEER_STATUS_VALID: the active peer device status is set to invalid
+ */
+MS2_PUBLIC MSZrtpPeerStatus ms_zrtp_get_peer_status(void *db, const char *peerUri, bctbx_mutex_t *dbMutex);
+
+/**
+ * Get the ZRTP Hello Hash from the given context
+ * @param[in]	ctx	MSZRTP context
+ * @param[out]	The Zrtp Hello Hash as defined in RFC6189 section 8
+ */
+MS2_PUBLIC int ms_zrtp_getHelloHash(MSZrtpContext* ctx, uint8_t *output, size_t outputLength);
+
+/**
+ * Set the optional ZRTP auxiliary shared secret
+ * @param[in]	ctx	MSZRTP context
+ * @param[in]	The ZRTP auxiliary shared secret
+ * @param[in]	The size of the auxiliary shared secret
+ * @return	0 on success, error code otherwise
+ */
+MS2_PUBLIC int ms_zrtp_setAuxiliarySharedSecret(MSZrtpContext *ctx, const uint8_t *auxSharedSecret, size_t auxSharedSecretLength);
+
+/**
+ * Get the ZRTP auxiliary shared secret mismatch status
+ * @param[in]	ctx	MSZRTP context
+ * @return	0 on match, 1 otherwise
+ */
+MS2_PUBLIC uint8_t ms_zrtp_getAuxiliarySharedSecretMismatch(MSZrtpContext *ctx);
+
+/**
+ * Set the peer ZRTP Hello Hash to the given context
+ * @param[in]	ctx	MSZRTP context
+ * @param[in]	The Zrtp Hello Hash as defined in RFC6189 section 8
+ * @param[in]	The Zrtp Hello Hash length
+ * @return	0 on success, error code otherwise
+ */
+MS2_PUBLIC int ms_zrtp_setPeerHelloHash(MSZrtpContext *ctx, uint8_t *peerHelloHashHexString, size_t peerHelloHashHexStringLength);
+
+/**
+ * from_string and to_string for enums: MSZrtpHash, MSZrtpCipher, MSZrtpAuthTag, MSZrtpKeyAgreement, MSZrtpSasType
+ */
+MS2_PUBLIC MSZrtpHash ms_zrtp_hash_from_string(const char* str);
+MS2_PUBLIC const char* ms_zrtp_hash_to_string(const MSZrtpHash hash);
+MS2_PUBLIC MSZrtpCipher ms_zrtp_cipher_from_string(const char* str);
+MS2_PUBLIC const char* ms_zrtp_cipher_to_string(const MSZrtpCipher cipher);
+MS2_PUBLIC MSZrtpAuthTag ms_zrtp_auth_tag_from_string(const char* str);
+MS2_PUBLIC const char* ms_zrtp_auth_tag_to_string(const MSZrtpAuthTag authTag);
+MS2_PUBLIC MSZrtpKeyAgreement ms_zrtp_key_agreement_from_string(const char* str);
+MS2_PUBLIC const char* ms_zrtp_key_agreement_to_string(const MSZrtpKeyAgreement keyAgreement);
+MS2_PUBLIC MSZrtpSasType ms_zrtp_sas_type_from_string(const char* str);
+MS2_PUBLIC const char* ms_zrtp_sas_type_to_string(const MSZrtpSasType sasType);
+
+/* Cache wrapper functions : functions needed by liblinphone wrapped to avoid direct dependence of linphone on bzrtp */
+/**
+ * @brief Check the given sqlite3 DB and create requested tables if needed
+ * 	Also manage DB schema upgrade
+ * @param[in/out]	db	Pointer to the sqlite3 db open connection
+ * 				Use a void * to keep this API when building cacheless
+ * @param[in]		dbMutex	a mutex to synchronise zrtp cache database operation. Ignored if NULL
+ *
+ * @return	0 on success, MSZRTP_CACHE_SETUP if cache was empty, MSZRTP_CACHE_UPDATE if db structure was updated error code otherwise
+ */
+MS2_PUBLIC int ms_zrtp_initCache(void *db, bctbx_mutex_t *dbMutex);
+
+/**
+ * @brief Perform migration from xml version to sqlite3 version of cache
+ *	Warning: new version of cache associate a ZID to each local URI, the old one did not
+ *		the migration function will associate any data in the cache to the sip URI given in parameter which shall be the default URI
+ * @param[in]		cacheXml	a pointer to an xmlDocPtr structure containing the old cache to be migrated
+ * @param[in/out]	cacheSqlite	a pointer to an sqlite3 structure containing a cache initialised using ms_zrtp_cache_init function
+ * @param[in]		selfURI		default sip URI for this end point, NULL terminated char
+ *
+ * @return	0 on success, MSZRTP_ERROR_CACHEDISABLED when bzrtp was not compiled with cache enabled, MSZRTP_ERROR_CACHEMIGRATIONFAILED on error during migration
+ */
+MS2_PUBLIC int ms_zrtp_cache_migration(void *cacheXmlPtr, void *cacheSqlite, const char *selfURI);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ms_zrtp_h */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Info.plist"
new file mode 100755
index 0000000..abf3ac5
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/mediastreamer2" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/mediastreamer2"
new file mode 100755
index 0000000..d05256c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mediastreamer2.framework/mediastreamer2"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msamr.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msamr.framework/Info.plist"
new file mode 100755
index 0000000..a6ea3d5
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msamr.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msamr.framework/msamr" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msamr.framework/msamr"
new file mode 100755
index 0000000..5471a4e
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msamr.framework/msamr"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework/Info.plist"
new file mode 100755
index 0000000..2c5bdbf
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework/mscodec2" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework/mscodec2"
new file mode 100755
index 0000000..a523421
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mscodec2.framework/mscodec2"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework/Info.plist"
new file mode 100755
index 0000000..781bde6
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework/msopenh264" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework/msopenh264"
new file mode 100755
index 0000000..b8cc4b0
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msopenh264.framework/msopenh264"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mssilk.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mssilk.framework/Info.plist"
new file mode 100755
index 0000000..dc6be13
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mssilk.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mssilk.framework/mssilk" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mssilk.framework/mssilk"
new file mode 100755
index 0000000..bd2ec0f
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mssilk.framework/mssilk"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework/Info.plist"
new file mode 100755
index 0000000..e7cc7e1
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework/mswebrtc" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework/mswebrtc"
new file mode 100755
index 0000000..64c2286
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/mswebrtc.framework/mswebrtc"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msx264.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msx264.framework/Info.plist"
new file mode 100755
index 0000000..1bd34c9
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msx264.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msx264.framework/msx264" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msx264.framework/msx264"
new file mode 100755
index 0000000..2cf7cce
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/msx264.framework/msx264"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/b64.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/b64.h"
new file mode 100755
index 0000000..368da82
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/b64.h"
@@ -0,0 +1,421 @@
+/* /////////////////////////////////////////////////////////////////////////////
+ * File:        b64/b64.h
+ *
+ * Purpose:     Header file for the b64 library
+ *
+ * Created:     18th October 2004
+ * Updated:     24th August 2008
+ *
+ * Thanks:      To Adam McLaurin, for ideas regarding the b64_decode2() and
+ *              b64_encode2().
+ *
+ * Home:        http://synesis.com.au/software/
+ *
+ * Copyright (c) 2004-2008, Matthew Wilson and Synesis Software
+ * 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(s) of Matthew Wilson and Synesis Software nor the names of
+ *   any contributors may be used to endorse or promote products derived from
+ *   this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * 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.
+ *
+ * ////////////////////////////////////////////////////////////////////////// */
+
+
+/** \file ortp/b64.h
+ *
+ * \brief [C/C++] Header file for the b64 library.
+ */
+
+#ifndef B64_INCL_B64_H_B64
+#define B64_INCL_B64_H_B64
+
+/* /////////////////////////////////////////////////////////////////////////////
+ * Version information
+ */
+
+#ifndef B64_DOCUMENTATION_SKIP_SECTION
+# define B64_VER_B64_H_B64_MAJOR    1
+# define B64_VER_B64_H_B64_MINOR    5
+# define B64_VER_B64_H_B64_REVISION 4
+# define B64_VER_B64_H_B64_EDIT     28
+#endif /* !B64_DOCUMENTATION_SKIP_SECTION */
+
+/** \def B64_VER_MAJOR
+ * The major version number of b64
+ */
+
+/** \def B64_VER_MINOR
+ * The minor version number of b64
+ */
+
+/** \def B64_VER_REVISION
+ * The revision version number of b64
+ */
+
+/** \def B64_VER
+ * The current composite version number of b64
+ */
+
+#ifndef B64_DOCUMENTATION_SKIP_SECTION
+# define B64_VER_1_0_1      0x01000100
+# define B64_VER_1_0_2      0x01000200
+# define B64_VER_1_0_3      0x01000300
+# define B64_VER_1_1_1      0x01010100
+# define B64_VER_1_1_2      0x01010200
+# define B64_VER_1_1_3      0x01010300
+# define B64_VER_1_2_1      0x01020100
+# define B64_VER_1_2_2      0x01020200
+# define B64_VER_1_2_3      0x01020300
+# define B64_VER_1_2_4      0x01020400
+# define B64_VER_1_2_5      0x01020500
+# define B64_VER_1_2_6      0x01020600
+# define B64_VER_1_2_7      0x01020700
+# define B64_VER_1_3_1      0x010301ff
+# define B64_VER_1_3_2      0x010302ff
+# define B64_VER_1_3_3      0x010303ff
+# define B64_VER_1_3_4      0x010304ff
+
+# define B64_VER            B64_VER_1_3_4
+#else /* ? B64_DOCUMENTATION_SKIP_SECTION */
+# define B64_VER            0x010304ff
+#endif /* !B64_DOCUMENTATION_SKIP_SECTION */
+
+#define B64_VER_MAJOR       1
+#define B64_VER_MINOR       3
+#define B64_VER_REVISION    4
+
+/* /////////////////////////////////////////////////////////////////////////////
+ * Includes
+ */
+
+#include <stddef.h>
+#include "ortp/port.h"
+
+/* /////////////////////////////////////////////////////////////////////////////
+ * Namespace
+ */
+
+#if !defined(B64_NO_NAMESPACE) && \
+    !defined(__cplusplus)
+# define B64_NO_NAMESPACE
+#endif /* !B64_NO_NAMESPACE && !__cplusplus */
+
+#ifdef B64_NAMESPACE
+# undef B64_NAMESPACE
+#endif /* B64_NAMESPACE */
+
+#ifdef B64_NAMESPACE_QUALIFIER
+# undef B64_NAMESPACE_QUALIFIER
+#endif /* B64_NAMESPACE_QUALIFIER */
+
+
+#ifndef B64_NO_NAMESPACE
+
+# ifdef B64_CUSTOM_NAMESPACE
+#  define B64_NAMESPACE     B64_CUSTOM_NAMESPACE
+# else /* ? B64_CUSTOM_NAMESPACE */
+#  define B64_NAMESPACE     b64
+# endif /* B64_CUSTOM_NAMESPACE */
+
+# if defined(B64_CUSTOM_NAMESPACE) && \
+     defined(B64_CUSTOM_NAMESPACE_QUALIFIER)
+#  define B64_NAMESPACE_QUALIFIER       B64_CUSTOM_NAMESPACE_QUALIFIER
+# else /* B64_CUSTOM_NAMESPACE && B64_CUSTOM_NAMESPACE_QUALIFIER */
+#  define B64_NAMESPACE_QUALIFIER       ::B64_NAMESPACE
+# endif /* B64_CUSTOM_NAMESPACE && B64_CUSTOM_NAMESPACE_QUALIFIER */
+
+
+/** \brief [C/C++] The b64 namespace, within which the core library types and functions
+ * reside in C++ compilation. In C compilation, they all reside in the global
+ * namespace.
+ *
+ * \htmlonly
+ * <hr>
+ * \endhtmlonly
+ */
+namespace B64_NAMESPACE
+{
+#endif /* !B64_NO_NAMESPACE */
+
+/* /////////////////////////////////////////////////////////////////////////////
+ * Enumerations
+ */
+
+/** \brief Return codes (from b64_encode2() / b64_decode2())
+ */
+enum B64_RC
+{
+        B64_RC_OK                   =   0   /*!< Operation was successful. */
+    ,   B64_RC_INSUFFICIENT_BUFFER  =   1   /*!< The given translation buffer was not of sufficient size. */
+    ,   B64_RC_TRUNCATED_INPUT      =   2   /*!< The input did not represent a fully formed stream of octet couplings. */
+    ,   B64_RC_DATA_ERROR           =   3   /*!< Invalid data. */
+#ifndef B64_DOCUMENTATION_SKIP_SECTION
+    ,   B64_max_RC_value
+#endif /* !B64_DOCUMENTATION_SKIP_SECTION */
+};
+
+#ifndef __cplusplus
+typedef enum B64_RC B64_RC;
+#endif /* !__cplusplus */
+
+/** \brief Coding behaviour modification flags (for b64_encode2() / b64_decode2())
+ */
+enum B64_FLAGS
+{
+        B64_F_LINE_LEN_USE_PARAM    =   0x0000  /*!< Uses the lineLen parameter to b64_encode2(). Ignored by b64_decode2(). */
+    ,   B64_F_LINE_LEN_INFINITE     =   0x0001  /*!< Ignores the lineLen parameter to b64_encode2(). Line length is infinite. Ignored by b64_decode2(). */
+    ,   B64_F_LINE_LEN_64           =   0x0002  /*!< Ignores the lineLen parameter to b64_encode2(). Line length is 64. Ignored by b64_decode2(). */
+    ,   B64_F_LINE_LEN_76           =   0x0003  /*!< Ignores the lineLen parameter to b64_encode2(). Line length is 76. Ignored by b64_decode2(). */
+    ,   B64_F_LINE_LEN_MASK         =   0x000f  /*!< Mask for testing line length flags to b64_encode2(). Ignored by b64_encode2(). */
+    ,   B64_F_STOP_ON_NOTHING       =   0x0000  /*!< Decoding ignores all invalid characters in the input data. Ignored by b64_encode2(). */
+    ,   B64_F_STOP_ON_UNKNOWN_CHAR  =   0x0100  /*!< Causes decoding to break if any non-Base-64 [a-zA-Z0-9=+/], non-whitespace character is encountered. Ignored by b64_encode2(). */
+    ,   B64_F_STOP_ON_UNEXPECTED_WS =   0x0200  /*!< Causes decoding to break if any unexpected whitespace is encountered. Ignored by b64_encode2(). */
+    ,   B64_F_STOP_ON_BAD_CHAR      =   0x0300  /*!< Causes decoding to break if any non-Base-64 [a-zA-Z0-9=+/] character is encountered. Ignored by b64_encode2(). */
+};
+
+#ifndef __cplusplus
+typedef enum B64_FLAGS  B64_FLAGS;
+#endif /* !__cplusplus */
+
+/* /////////////////////////////////////////////////////////////////////////////
+ * Functions
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** \brief Encodes a block of binary data into Base-64
+ *
+ * \param src Pointer to the block to be encoded. May not be NULL, except when
+ *   \c dest is NULL, in which case it is ignored.
+ * \param srcSize Length of block to be encoded
+ * \param dest Pointer to the buffer into which the result is to be written. May
+ *   be NULL, in which case the function returns the required length
+ * \param destLen Length of the buffer into which the result is to be written. Must
+ *   be at least as large as that indicated by the return value from
+ *   \link b64::b64_encode b64_encode(NULL, srcSize, NULL, 0)\endlink.
+ *
+ * \return 0 if the size of the buffer was insufficient, or the length of the
+ * converted buffer was longer than \c destLen
+ *
+ * \note The function returns the required length if \c dest is NULL
+ *
+ * \note The function returns the required length if \c dest is NULL. The returned size
+ *   might be larger than the actual required size, but will never be smaller.
+ *
+ * \note Threading: The function is fully re-entrant.
+ *
+ * \see b64::encode()
+ */
+ORTP_PUBLIC size_t b64_encode(void const *src, size_t srcSize, char *dest, size_t destLen);
+
+/** \brief Encodes a block of binary data into Base-64
+ *
+ * \param src Pointer to the block to be encoded. May not be NULL, except when
+ *   \c dest is NULL, in which case it is ignored.
+ * \param srcSize Length of block to be encoded
+ * \param dest Pointer to the buffer into which the result is to be written. May
+ *   be NULL, in which case the function returns the required length
+ * \param destLen Length of the buffer into which the result is to be written. Must
+ *   be at least as large as that indicated by the return value from
+ *   \link b64::b64_encode2 b64_encode2(NULL, srcSize, NULL, 0, flags, lineLen, rc)\endlink.
+ * \param flags A combination of the B64_FLAGS enumeration, that moderate the
+ *   behaviour of the function
+ * \param lineLen If the flags parameter contains B64_F_LINE_LEN_USE_PARAM, then
+ *   this parameter represents the length of the lines into which the encoded form is split,
+ *   with a hard line break ('\\r\\n'). If this value is 0, then the line is not
+ *   split. If it is <0, then the RFC-1113 recommended line length of 64 is used
+ * \param rc The return code representing the status of the operation. May be NULL.
+ *
+ * \return 0 if the size of the buffer was insufficient, or the length of the
+ *   converted buffer was longer than \c destLen
+ *
+ * \note The function returns the required length if \c dest is NULL. The returned size
+ *   might be larger than the actual required size, but will never be smaller.
+ *
+ * \note Threading: The function is fully re-entrant.
+ *
+ * \see b64::encode()
+ */
+size_t b64_encode2( void const  *src
+                ,   size_t      srcSize
+                ,   char        *dest
+                ,   size_t      destLen
+                ,   unsigned    flags
+                ,   int         lineLen /* = 0 */
+                ,   B64_RC      *rc     /* = NULL */);
+
+/** \brief Decodes a sequence of Base-64 into a block of binary data
+ *
+ * \param src Pointer to the Base-64 block to be decoded. May not be NULL, except when
+ *   \c dest is NULL, in which case it is ignored. If \c dest is NULL, and \c src is
+ *   <b>not</b> NULL, then the returned value is calculated exactly, otherwise a value
+ *   is returned that is guaranteed to be large enough to hold the decoded block.
+ *
+ * \param srcLen Length of block to be encoded. Must be an integral of 4, the Base-64
+ *   encoding quantum, otherwise the Base-64 block is assumed to be invalid
+ * \param dest Pointer to the buffer into which the result is to be written. May
+ *   be NULL, in which case the function returns the required length
+ * \param destSize Length of the buffer into which the result is to be written. Must
+ *   be at least as large as that indicated by the return value from
+ *   \c b64_decode(src, srcSize, NULL, 0), even in the case where the encoded form
+ *   contains a number of characters that will be ignored, resulting in a lower total
+ *   length of converted form.
+ *
+ * \return 0 if the size of the buffer was insufficient, or the length of the
+ *   converted buffer was longer than \c destSize
+ *
+ * \note The function returns the required length if \c dest is NULL. The returned size
+ *   might be larger than the actual required size, but will never be smaller.
+ *
+ * \note \anchor anchor__4_characters The behaviour of both
+ * \link b64::b64_encode2 b64_encode2()\endlink
+ * and
+ * \link b64::b64_decode2 b64_decode2()\endlink
+ * are undefined if the line length is not a multiple of 4.
+ *
+ * \note Threading: The function is fully re-entrant.
+ *
+ * \see b64::decode()
+ */
+ORTP_PUBLIC size_t b64_decode(char const *src, size_t srcLen, void *dest, size_t destSize);
+
+/** \brief Decodes a sequence of Base-64 into a block of binary data
+ *
+ * \param src Pointer to the Base-64 block to be decoded. May not be NULL, except when
+ * \c dest is NULL, in which case it is ignored. If \c dest is NULL, and \c src is
+ * <b>not</b> NULL, then the returned value is calculated exactly, otherwise a value
+ * is returned that is guaranteed to be large enough to hold the decoded block.
+ *
+ * \param srcLen Length of block to be encoded. Must be an integral of 4, the Base-64
+ *   encoding quantum, otherwise the Base-64 block is assumed to be invalid
+ * \param dest Pointer to the buffer into which the result is to be written. May
+ *   be NULL, in which case the function returns the required length
+ * \param destSize Length of the buffer into which the result is to be written. Must
+ *   be at least as large as that indicated by the return value from
+ *   \c b64_decode(src, srcSize, NULL, 0), even in the case where the encoded form
+ *   contains a number of characters that will be ignored, resulting in a lower total
+ *   length of converted form.
+ * \param flags A combination of the B64_FLAGS enumeration, that moderate the
+ *   behaviour of the function.
+ * \param rc The return code representing the status of the operation. May be NULL.
+ * \param badChar If the flags parameter does not contain B64_F_STOP_ON_NOTHING, this
+ *   parameter specifies the address of a pointer that will be set to point to any
+ *   character in the sequence that stops the parsing, as dictated by the flags
+ *   parameter. May be NULL.
+ *
+ * \return 0 if the size of the buffer was insufficient, or the length of the
+ * converted buffer was longer than \c destSize, or a bad character stopped parsing.
+ *
+ * \note The function returns the required length if \c dest is NULL. The returned size
+ *   might be larger than the actual required size, but will never be smaller.
+ *
+ * \note The behaviour of both
+ * \link b64::b64_encode2 b64_encode2()\endlink
+ * and
+ * \link b64::b64_decode2 b64_decode2()\endlink
+ * are undefined if the line length is not a multiple of 4.
+ *
+ * \note Threading: The function is fully re-entrant.
+ *
+ * \see b64::decode()
+ */
+size_t b64_decode2( char const  *src
+                ,   size_t      srcLen
+                ,   void        *dest
+                ,   size_t      destSize
+                ,   unsigned    flags
+                ,   char const  **badChar   /* = NULL */
+                ,   B64_RC      *rc         /* = NULL */);
+
+
+/** \brief Returns the textual description of the error
+ *
+ * \param code The \link b64::B64_RC error code\endlink
+ */
+char const *b64_getErrorString(B64_RC code);
+
+/** \brief Returns the length of the textual description of the error
+ *
+ * \see b64_getErrorString()
+ *
+ * \param code The \link b64::B64_RC error code\endlink
+ */
+size_t b64_getErrorStringLength(B64_RC code);
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* __cplusplus */
+
+/* /////////////////////////////////////////////////////////////////////////////
+ * Namespace
+ */
+
+#ifndef B64_NO_NAMESPACE
+} /* namespace B64_NAMESPACE */
+
+# ifndef B64_DOCUMENTATION_SKIP_SECTION
+
+namespace stlsoft
+{
+
+    inline char const *c_str_data_a( B64_NAMESPACE_QUALIFIER::B64_RC code)
+    {
+        return B64_NAMESPACE_QUALIFIER::b64_getErrorString(code);
+    }
+    inline char const *c_str_data( B64_NAMESPACE_QUALIFIER::B64_RC code)
+    {
+        return B64_NAMESPACE_QUALIFIER::b64_getErrorString(code);
+    }
+
+    inline size_t c_str_len_a( B64_NAMESPACE_QUALIFIER::B64_RC code)
+    {
+        return B64_NAMESPACE_QUALIFIER::b64_getErrorStringLength(code);
+    }
+    inline size_t c_str_len( B64_NAMESPACE_QUALIFIER::B64_RC code)
+    {
+        return B64_NAMESPACE_QUALIFIER::b64_getErrorStringLength(code);
+    }
+
+    inline char const *c_str_ptr_a( B64_NAMESPACE_QUALIFIER::B64_RC code)
+    {
+        return B64_NAMESPACE_QUALIFIER::b64_getErrorString(code);
+    }
+    inline char const *c_str_ptr( B64_NAMESPACE_QUALIFIER::B64_RC code)
+    {
+        return B64_NAMESPACE_QUALIFIER::b64_getErrorString(code);
+    }
+
+} /* namespace stlsoft */
+
+# endif /* !B64_DOCUMENTATION_SKIP_SECTION */
+
+#endif /* !B64_NO_NAMESPACE */
+
+/* ////////////////////////////////////////////////////////////////////////// */
+
+#endif /* B64_INCL_B64_H_B64 */
+
+/* ////////////////////////////////////////////////////////////////////////// */
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/event.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/event.h"
new file mode 100755
index 0000000..dd9c59d
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/event.h"
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ortp_events_h
+#define ortp_events_h
+
+#include "ortp/str_utils.h"
+#include "ortp/rtcp.h"
+#include "bctoolbox/list.h"
+
+typedef mblk_t OrtpEvent;
+
+typedef unsigned long OrtpEventType;
+
+typedef enum {
+	OrtpRTPSocket,
+	OrtpRTCPSocket
+} OrtpSocketType;
+
+struct _OrtpEventData{
+	mblk_t *packet;	/* most events are associated to a received packet */
+	struct sockaddr_storage source_addr;
+	socklen_t source_addrlen;
+	ortpTimeSpec ts;
+	union {
+		int telephone_event;
+		int payload_type;
+		bool_t dtls_stream_encrypted;
+		bool_t zrtp_stream_encrypted;
+		bool_t ice_processing_successful;
+		struct _ZrtpInfo{
+			char sas[32]; // up to 31 + null characters
+			bool_t verified;
+			bool_t cache_mismatch;
+			bool_t pad[2];
+		} zrtp_info;
+		OrtpSocketType socket_type;
+		uint32_t received_rtt_character;
+		bool_t congestion_detected;
+		float video_bandwidth_available;
+		int jitter_min_size_for_nack;
+	} info;
+};
+
+typedef struct _OrtpEventData OrtpEventData;
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+ORTP_PUBLIC OrtpEvent * ortp_event_new(OrtpEventType tp);
+ORTP_PUBLIC OrtpEventType ortp_event_get_type(const OrtpEvent *ev);
+/* type is one of the following*/
+#define ORTP_EVENT_STUN_PACKET_RECEIVED		1
+#define ORTP_EVENT_PAYLOAD_TYPE_CHANGED 	2
+#define ORTP_EVENT_TELEPHONE_EVENT		3
+#define ORTP_EVENT_RTCP_PACKET_RECEIVED		4 /**<when a RTCP packet is received from far end */
+#define ORTP_EVENT_RTCP_PACKET_EMITTED		5 /**<fired when oRTP decides to send an automatic RTCP SR or RR */
+#define ORTP_EVENT_ZRTP_ENCRYPTION_CHANGED	6
+#define ORTP_EVENT_ZRTP_SAS_READY		7
+#define ORTP_EVENT_ICE_CHECK_LIST_PROCESSING_FINISHED	8
+#define ORTP_EVENT_ICE_SESSION_PROCESSING_FINISHED	9
+#define ORTP_EVENT_ICE_GATHERING_FINISHED		10
+#define ORTP_EVENT_ICE_LOSING_PAIRS_COMPLETED		11
+#define ORTP_EVENT_ICE_RESTART_NEEDED			12
+#define ORTP_EVENT_DTLS_ENCRYPTION_CHANGED		13
+#define ORTP_EVENT_RTT_CHARACTER_RECEIVED		15
+#define ORTP_EVENT_CONGESTION_STATE_CHANGED		16
+#define ORTP_EVENT_ZRTP_CACHE_MISMATCH			17
+#define ORTP_EVENT_ZRTP_PEER_VERSION_OBSOLETE		18
+#define ORTP_EVENT_NEW_VIDEO_BANDWIDTH_ESTIMATION_AVAILABLE             19
+#define ORTP_EVENT_ICE_DEACTIVATION_NEEDED		20
+#define ORTP_EVENT_JITTER_UPDATE_FOR_NACK		21
+
+ORTP_PUBLIC OrtpEventData * ortp_event_get_data(OrtpEvent *ev);
+ORTP_PUBLIC void ortp_event_destroy(OrtpEvent *ev);
+ORTP_PUBLIC OrtpEvent *ortp_event_dup(OrtpEvent *ev);
+
+typedef struct OrtpEvQueue{
+	queue_t q;
+	ortp_mutex_t mutex;
+} OrtpEvQueue;
+
+ORTP_PUBLIC OrtpEvQueue * ortp_ev_queue_new(void);
+ORTP_PUBLIC void ortp_ev_queue_destroy(OrtpEvQueue *q);
+ORTP_PUBLIC OrtpEvent * ortp_ev_queue_get(OrtpEvQueue *q);
+ORTP_PUBLIC void ortp_ev_queue_flush(OrtpEvQueue * qp);
+
+struct _RtpSession;
+
+/**
+ * Callback function when a RTCP packet of the interested type is found.
+ *
+ * @param evd the packet. Read-only, must NOT be changed.
+ * @param user_data user data provided when registered the callback
+ *
+ */
+typedef void (*OrtpEvDispatcherCb)(const OrtpEventData *evd, void *user_data);
+typedef struct OrtpEvDispatcherData{
+	OrtpEventType type;
+	rtcp_type_t subtype;
+	OrtpEvDispatcherCb on_found;
+	void* user_data;
+} OrtpEvDispatcherData;
+
+typedef struct OrtpEvDispatcher{
+	OrtpEvQueue *q;
+	struct _RtpSession* session;
+	bctbx_list_t *cbs;
+} OrtpEvDispatcher;
+
+/**
+ * Constructs an OrtpEvDispatcher object. This object can be used to be notified
+ * when any RTCP type packet is received or emitted on the rtp session,
+ * given a callback registered with \a ortp_ev_dispatcher_connect
+ *
+ * @param session RTP session to listen on. Cannot be NULL.
+ *
+ * @return OrtpEvDispatcher object newly created.
+ */
+ORTP_PUBLIC OrtpEvDispatcher * ortp_ev_dispatcher_new(struct _RtpSession* session);
+/**
+ * Frees the memory for the given dispatcher. Note that user_data must be freed
+ * by caller, and so does the OrtpEvQueue.
+ *
+ * @param d OrtpEvDispatcher object
+ */
+ORTP_PUBLIC void ortp_ev_dispatcher_destroy(OrtpEvDispatcher *d);
+/**
+ * Iterate method to be called periodically. If a RTCP packet is found and
+ * its type matches one of the callback connected with \a ortp_ev_dispatcher_connect,
+ * this callback will be invoked in the current thread.
+ *
+ * @param d OrtpEvDispatcher object
+ */
+ORTP_PUBLIC void ortp_ev_dispatcher_iterate(OrtpEvDispatcher *d);
+/**
+ * Connects a callback to the given type of event packet and, in case of RTCP event,
+ * for the given RTCP subtype.
+ * When any event is found, the callback is invoked. Multiple
+ * callbacks can be connected to the same type of event, and the same callback
+ * can be connected to multiple type of event.
+ *
+ * @param d OrtpEvDispatcher object
+ * @param type type of event to be notified of.
+ * @param subtype when type is set to ORTP_EVENT_RTCP_PACKET_RECEIVED or ORTP_EVENT_RTCP_PACKET_EMITTED, subtype of RTCP packet to be notified of. Otherwise this parameter is not used.
+ * @param on_receive function to call when a RTCP packet of the given type is found.
+ * @param user_data user data given as last argument of the callback. Can be NULL. MUST be freed by user.
+ */
+ORTP_PUBLIC void ortp_ev_dispatcher_connect(OrtpEvDispatcher *d
+											, OrtpEventType type
+											, rtcp_type_t subtype
+											, OrtpEvDispatcherCb on_receive
+											, void *user_data);
+
+/**
+ * Disconnects the given callback for the given type and subtype on the given dispatcher.
+*/
+ORTP_PUBLIC void ortp_ev_dispatcher_disconnect(OrtpEvDispatcher *d
+								, OrtpEventType type
+								, rtcp_type_t subtype
+								, OrtpEvDispatcherCb cb);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/logging.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/logging.h"
new file mode 100755
index 0000000..018efad
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/logging.h"
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file logging.h
+ * \brief Logging API.
+ *
+**/
+
+#ifndef ORTP_LOGGING_H
+#define ORTP_LOGGING_H
+
+#include <ortp/port.h>
+
+#define ORTP_LOG_DOMAIN BCTBX_LOG_DOMAIN
+
+#include "bctoolbox/logging.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/***************/
+/* logging api */
+/***************/
+	
+#define ORTP_FATAL BCTBX_LOG_FATAL
+#define	ORTP_ERROR BCTBX_LOG_ERROR
+#define	ORTP_WARNING BCTBX_LOG_WARNING
+#define	ORTP_MESSAGE BCTBX_LOG_MESSAGE
+#define	ORTP_TRACE	BCTBX_LOG_TRACE
+#define	ORTP_DEBUG	BCTBX_LOG_DEBUG
+#define	ORTP_END BCTBX_LOG_END
+#define ORTP_LOGLEV_END BCTBX_LOG_LOGLEV_END
+#define OrtpLogLevel BctbxLogLevel
+	
+#define OrtpLogFunc BctbxLogFunc
+
+	
+
+/*#define ortp_set_log_file bctbx_set_log_file*/
+ORTP_PUBLIC void ortp_set_log_file(FILE *file);
+
+/*#define ortp_set_log_handler bctbx_set_log_handler*/
+ORTP_PUBLIC void ortp_set_log_handler(OrtpLogFunc func);
+
+
+/* This function does not have any means by now, as even bctbx_set_log_handler is deprecated. use bctbx_log_handler_t instead*/
+ ORTP_PUBLIC OrtpLogFunc ortp_get_log_handler(void);
+
+
+#define ortp_logv_out bctbx_logv_out
+/*ORTP_PUBLIC void ortp_logv_out(const char *domain, OrtpLogLevel level, const char *fmt, va_list args);*/
+
+#define ortp_log_level_enabled(domain, level)	(bctbx_get_log_level_mask(domain) & (level))
+#define ortp_logv bctbx_logv
+/*ORTP_PUBLIC void ortp_logv(const char *domain, OrtpLogLevel level, const char *fmt, va_list args);*/
+
+/**
+ * Flushes the log output queue.
+ * WARNING: Must be called from the thread that has been defined with ortp_set_log_thread_id().
+ */
+#define ortp_logv_flush bctbx_logv_flush
+/*ORTP_PUBLIC void ortp_logv_flush(void);*/
+
+/**
+ * Activate all log level greater or equal than specified level argument.
+**/
+#define ortp_set_log_level bctbx_set_log_level
+/*ORTP_PUBLIC void ortp_set_log_level(const char *domain, OrtpLogLevel level);*/
+
+#define ortp_set_log_level_mask bctbx_set_log_level_mask
+/*ORTP_PUBLIC void ortp_set_log_level_mask(const char *domain, int levelmask);*/
+#define ortp_get_log_level_mask bctbx_get_log_level_mask
+/*ORTP_PUBLIC unsigned int ortp_get_log_level_mask(const char *domain);*/
+
+/**
+ * Tell oRTP the id of the thread used to output the logs.
+ * This is meant to output all the logs from the same thread to prevent deadlock problems at the application level.
+ * @param[in] thread_id The id of the thread that will output the logs (can be obtained using ortp_thread_self()).
+ */
+#define ortp_set_log_thread_id bctbx_set_log_thread_id
+/*ORTP_PUBLIC void ortp_set_log_thread_id(unsigned long thread_id);*/
+
+#ifdef ORTP_DEBUG_MODE
+#define ortp_debug bctbx_debug
+#else
+
+#define ortp_debug(...)
+
+#endif
+
+#ifdef ORTP_NOMESSAGE_MODE
+
+#define ortp_log(...)
+#define ortp_message(...)
+#define ortp_warning(...)
+
+#else
+
+static ORTP_INLINE void CHECK_FORMAT_ARGS(2,3) ortp_log(OrtpLogLevel lev, const char *fmt,...) {
+	va_list args;
+	va_start (args, fmt);
+	bctbx_logv(ORTP_LOG_DOMAIN, lev, fmt, args);
+	va_end (args);
+}
+	
+#define ortp_message bctbx_message
+#define ortp_warning bctbx_warning
+#define ortp_error bctbx_error
+#define ortp_fatal bctbx_fatal
+#endif /*ORTP_NOMESSAGE_MODE*/
+	
+#ifdef __QNX__
+#define ortp_qnx_log_handler bctbx_qnx_log_handler
+/*void ortp_qnx_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args);*/
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/nack.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/nack.h"
new file mode 100755
index 0000000..397aa1f
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/nack.h"
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NACK_H
+#define NACK_H
+
+#include <bctoolbox/list.h>
+#include <bctoolbox/port.h>
+#include <ortp/port.h>
+#include <ortp/rtpsession.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+struct _OrtpNackContext {
+	RtpSession *session;
+	OrtpEvDispatcher *ev_dispatcher;
+	RtpTransportModifier *rtp_modifier;
+	queue_t sent_packets;
+	bctbx_mutex_t sent_packets_mutex;
+	int max_packets;
+	int min_jitter_before_nack;
+	bool_t decrease_jitter_timer_running;
+	uint64_t decrease_jitter_timer_start;
+};
+
+typedef struct _OrtpNackContext OrtpNackContext;
+
+ORTP_PUBLIC OrtpNackContext *ortp_nack_context_new(OrtpEvDispatcher *evt);
+ORTP_PUBLIC void ortp_nack_context_destroy(OrtpNackContext *ctx);
+
+ORTP_PUBLIC void ortp_nack_context_set_max_packet(OrtpNackContext *ctx, int max);
+
+ORTP_PUBLIC void ortp_nack_context_process_timer(OrtpNackContext *ctx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/ortp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/ortp.h"
new file mode 100755
index 0000000..fe8d3ab
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/ortp.h"
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** \mainpage oRTP API documentation
+ *
+ * \section init Initializing oRTP
+ *
+ * see ortp.h documentation.
+ *
+ * \section rtpsession the RtpSession object
+ *
+ * see the rtpsession.h documentation.
+ *
+ * \section payloadtypes Managing PayloadType(s) and RtpProfile(s)
+ *
+ * see the payloadtype.h documentation.
+ *
+ * \section telephonevents Sending and receiving telephone-event (RFC2833)
+ *
+ * see the telephonyevents.h documentation.
+ * To get informed about incoming telephone-event you can register a callback
+ * using rtp_session_signal_connect() or by registering an event queue using
+ * rtp_session_register_event_queue().
+ *
+ * \section sessionset Managing several RtpSession simultaneously
+ *
+ * see the sessionset.h documentation.
+ *
+ * \section rtcp Parsing incoming rtcp packets.
+ *
+ * The parsing api is defined in rtcp.h (not yet documented).
+ *
+ * \section examples Examples
+ *
+ * oRTP comes with a set of examples in src/tests.
+ * - rtprecv.c rtpsend.c show how to receive and send a single RTP stream.
+ * - mrtprecv.c mrtpsend.c show how to receive and send multiple RTP streams
+ *   simultaneously
+ *
+ */
+
+/**
+ * \file ortp.h
+ * \brief General purpose library functions.
+ *
+**/
+
+#ifndef ORTP_H
+#define ORTP_H
+#include "ortp/logging.h"
+#include "ortp/rtpsession.h"
+#include "ortp/sessionset.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ORTP_PUBLIC bool_t ortp_min_version_required(int major, int minor, int micro);
+ORTP_PUBLIC void ortp_init(void);
+ORTP_PUBLIC void ortp_scheduler_init(void);
+ORTP_PUBLIC void ortp_exit(void);
+
+/****************/
+/*statistics api*/
+/****************/
+
+extern rtp_stats_t ortp_global_stats;
+
+ORTP_PUBLIC void ortp_global_stats_reset(void);
+ORTP_PUBLIC rtp_stats_t *ortp_get_global_stats(void);
+
+ORTP_PUBLIC void ortp_global_stats_display(void);
+ORTP_PUBLIC void rtp_stats_display(const rtp_stats_t *stats, const char *header);
+ORTP_PUBLIC void rtp_stats_reset(rtp_stats_t *stats);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/payloadtype.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/payloadtype.h"
new file mode 100755
index 0000000..5dbf602
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/payloadtype.h"
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file payloadtype.h
+ * \brief Definition of payload types
+ *
+**/
+
+#ifndef PAYLOADTYPE_H
+#define PAYLOADTYPE_H
+#include <ortp/port.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/* flags for PayloadType::flags */
+
+#define	PAYLOAD_TYPE_ALLOCATED (1)
+/*payload type represents a VBR codec*/
+#define	PAYLOAD_TYPE_IS_VBR (1<<1)
+#define	PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED (1<<2)
+/* private flags for future use by ortp */
+#define	PAYLOAD_TYPE_PRIV1 (1<<3)
+/* user flags, can be used by the application on top of oRTP */
+#define	PAYLOAD_TYPE_USER_FLAG_0 (1<<4)
+#define	PAYLOAD_TYPE_USER_FLAG_1 (1<<5)
+#define	PAYLOAD_TYPE_USER_FLAG_2 (1<<6)
+#define	PAYLOAD_TYPE_USER_FLAG_3 (1<<7)
+#define	PAYLOAD_TYPE_USER_FLAG_4 (1<<8)
+/* ask for more if you need*/
+
+#define PAYLOAD_TYPE_FLAG_CAN_RECV PAYLOAD_TYPE_USER_FLAG_1
+#define PAYLOAD_TYPE_FLAG_CAN_SEND PAYLOAD_TYPE_USER_FLAG_2
+
+#define PAYLOAD_AUDIO_CONTINUOUS 0
+#define PAYLOAD_AUDIO_PACKETIZED 1
+#define PAYLOAD_VIDEO 2
+#define PAYLOAD_TEXT 3
+#define PAYLOAD_OTHER 4  /* ?? */
+
+#define PAYLOAD_TYPE_AVPF_NONE 0
+#define PAYLOAD_TYPE_AVPF_FIR (1 << 0)
+#define PAYLOAD_TYPE_AVPF_PLI (1 << 1)
+#define PAYLOAD_TYPE_AVPF_SLI (1 << 2)
+#define PAYLOAD_TYPE_AVPF_RPSI (1 << 3)
+
+struct _PayloadTypeAvpfParams {
+	unsigned char features; /**< A bitmask of PAYLOAD_TYPE_AVPF_* macros. */
+	bool_t rpsi_compatibility; /*< Linphone uses positive feeback for RPSI. However first versions handling
+		AVPF wrongly declared RPSI as negative feedback, so this is kept for compatibility
+		with these versions but will probably be removed at some point in time. */
+	uint16_t trr_interval; /**< The interval in milliseconds between regular RTCP packets. */
+};
+
+struct _OrtpPayloadType
+{
+	int type; /**< one of PAYLOAD_* macros*/
+	int clock_rate; /**< rtp clock rate*/
+	char bits_per_sample;	/* in case of continuous audio data */
+	char *zero_pattern;
+	int pattern_length;
+	/* other useful information for the application*/
+	int normal_bitrate;	/*in bit/s */
+	char *mime_type; /**<actually the submime, ex: pcm, pcma, gsm*/
+	int channels; /**< number of channels of audio */
+	char *recv_fmtp; /* various format parameters for the incoming stream */
+	char *send_fmtp; /* various format parameters for the outgoing stream */
+	struct _PayloadTypeAvpfParams avpf; /* AVPF parameters */
+	int flags;
+	void *user_data;
+};
+
+#ifndef PayloadType_defined
+#define PayloadType_defined
+typedef struct _OrtpPayloadType OrtpPayloadType;
+typedef OrtpPayloadType PayloadType;
+typedef struct _PayloadTypeAvpfParams PayloadTypeAvpfParams;
+#endif
+
+#define payload_type_set_flag(pt,flag) (pt)->flags|=((int)flag)
+#define payload_type_unset_flag(pt,flag) (pt)->flags&=(~(int)flag)
+#define payload_type_get_flags(pt)	(pt)->flags
+
+
+ORTP_PUBLIC PayloadType *payload_type_new(void);
+ORTP_PUBLIC PayloadType *payload_type_clone(const PayloadType *payload);
+ORTP_PUBLIC char *payload_type_get_rtpmap(PayloadType *pt);
+ORTP_PUBLIC void payload_type_destroy(PayloadType *pt);
+ORTP_PUBLIC void payload_type_set_recv_fmtp(PayloadType *pt, const char *fmtp);
+ORTP_PUBLIC void payload_type_set_send_fmtp(PayloadType *pt, const char *fmtp);
+ORTP_PUBLIC void payload_type_append_recv_fmtp(PayloadType *pt, const char *fmtp);
+ORTP_PUBLIC void payload_type_append_send_fmtp(PayloadType *pt, const char *fmtp);
+#define payload_type_get_avpf_params(pt)	((pt)->avpf)
+ORTP_PUBLIC void payload_type_set_avpf_params(PayloadType *pt, PayloadTypeAvpfParams params);
+ORTP_PUBLIC bool_t payload_type_is_vbr(const PayloadType *pt);
+
+#define payload_type_get_bitrate(pt)	((pt)->normal_bitrate)
+#define payload_type_get_rate(pt)		((pt)->clock_rate)
+#define payload_type_get_mime(pt)		((pt)->mime_type)
+
+ORTP_PUBLIC bool_t fmtp_get_value(const char *fmtp, const char *param_name, char *result, size_t result_len);
+
+#define payload_type_set_user_data(pt,p)	(pt)->user_data=(p)
+#define payload_type_get_user_data(pt)		((pt)->user_data)
+
+
+/* some payload types */
+/* audio */
+ORTP_VAR_PUBLIC PayloadType payload_type_pcmu8000;
+ORTP_VAR_PUBLIC PayloadType payload_type_pcma8000;
+ORTP_VAR_PUBLIC PayloadType payload_type_pcm8000;
+ORTP_VAR_PUBLIC PayloadType payload_type_l16_mono;
+ORTP_VAR_PUBLIC PayloadType payload_type_l16_stereo;
+ORTP_VAR_PUBLIC PayloadType payload_type_lpc1016;
+ORTP_VAR_PUBLIC PayloadType payload_type_g729;
+ORTP_VAR_PUBLIC PayloadType payload_type_g7231;
+ORTP_VAR_PUBLIC PayloadType payload_type_g7221;
+ORTP_VAR_PUBLIC PayloadType payload_type_cn;
+ORTP_VAR_PUBLIC PayloadType payload_type_g726_40;
+ORTP_VAR_PUBLIC PayloadType payload_type_g726_32;
+ORTP_VAR_PUBLIC PayloadType payload_type_g726_24;
+ORTP_VAR_PUBLIC PayloadType payload_type_g726_16;
+ORTP_VAR_PUBLIC PayloadType payload_type_aal2_g726_40;
+ORTP_VAR_PUBLIC PayloadType payload_type_aal2_g726_32;
+ORTP_VAR_PUBLIC PayloadType payload_type_aal2_g726_24;
+ORTP_VAR_PUBLIC PayloadType payload_type_aal2_g726_16;
+ORTP_VAR_PUBLIC PayloadType payload_type_gsm;
+ORTP_VAR_PUBLIC PayloadType payload_type_lpc;
+ORTP_VAR_PUBLIC PayloadType payload_type_lpc1015;
+ORTP_VAR_PUBLIC PayloadType payload_type_speex_nb;
+ORTP_VAR_PUBLIC PayloadType payload_type_speex_wb;
+ORTP_VAR_PUBLIC PayloadType payload_type_speex_uwb;
+ORTP_VAR_PUBLIC PayloadType payload_type_ilbc;
+ORTP_VAR_PUBLIC PayloadType payload_type_amr;
+ORTP_VAR_PUBLIC PayloadType payload_type_amrwb;
+ORTP_VAR_PUBLIC PayloadType payload_type_truespeech;
+ORTP_VAR_PUBLIC PayloadType payload_type_evrc0;
+ORTP_VAR_PUBLIC PayloadType payload_type_evrcb0;
+ORTP_VAR_PUBLIC PayloadType payload_type_silk_nb;
+ORTP_VAR_PUBLIC PayloadType payload_type_silk_mb;
+ORTP_VAR_PUBLIC PayloadType payload_type_silk_wb;
+ORTP_VAR_PUBLIC PayloadType payload_type_silk_swb;
+ORTP_VAR_PUBLIC PayloadType payload_type_aaceld_16k;
+ORTP_VAR_PUBLIC PayloadType payload_type_aaceld_22k;
+ORTP_VAR_PUBLIC PayloadType payload_type_aaceld_32k;
+ORTP_VAR_PUBLIC PayloadType payload_type_aaceld_44k;
+ORTP_VAR_PUBLIC PayloadType payload_type_aaceld_48k;
+ORTP_VAR_PUBLIC PayloadType payload_type_opus;
+ORTP_VAR_PUBLIC PayloadType payload_type_isac;
+ORTP_VAR_PUBLIC PayloadType payload_type_gsm_efr;
+ORTP_VAR_PUBLIC PayloadType payload_type_codec2;
+ORTP_VAR_PUBLIC PayloadType payload_type_bv16;
+
+/* video */
+ORTP_VAR_PUBLIC PayloadType payload_type_mpv;
+ORTP_VAR_PUBLIC PayloadType payload_type_h261;
+ORTP_VAR_PUBLIC PayloadType payload_type_h263;
+ORTP_VAR_PUBLIC PayloadType payload_type_h263_1998;
+ORTP_VAR_PUBLIC PayloadType payload_type_h263_2000;
+ORTP_VAR_PUBLIC PayloadType payload_type_mp4v;
+ORTP_VAR_PUBLIC PayloadType payload_type_theora;
+ORTP_VAR_PUBLIC PayloadType payload_type_h264;
+ORTP_VAR_PUBLIC PayloadType payload_type_h265;
+ORTP_VAR_PUBLIC PayloadType payload_type_x_snow;
+ORTP_VAR_PUBLIC PayloadType payload_type_jpeg;
+ORTP_VAR_PUBLIC PayloadType payload_type_vp8;
+
+ORTP_VAR_PUBLIC PayloadType payload_type_g722;
+
+/* text */
+ORTP_VAR_PUBLIC PayloadType payload_type_t140;
+ORTP_VAR_PUBLIC PayloadType payload_type_t140_red;
+
+/* non standard file transfer over UDP */
+ORTP_VAR_PUBLIC PayloadType payload_type_x_udpftp;
+
+/* telephone-event */
+ORTP_VAR_PUBLIC PayloadType payload_type_telephone_event;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/port.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/port.h"
new file mode 100755
index 0000000..7e2456c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/port.h"
@@ -0,0 +1,403 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/* this file is responsible of the portability of the stack */
+
+#ifndef ORTP_PORT_H
+#define ORTP_PORT_H
+
+#if __APPLE__
+#include "TargetConditionals.h"
+#endif
+
+#if !defined(_WIN32) && !defined(_WIN32_WCE)
+/********************************/
+/* definitions for UNIX flavour */
+/********************************/
+
+#include <errno.h>
+#include <sys/types.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+
+#ifdef __linux
+#include <stdint.h>
+#endif
+
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#if defined(_XOPEN_SOURCE_EXTENDED) || !defined(__hpux)
+#include <arpa/inet.h>
+#endif
+
+
+
+#include <sys/time.h>
+
+#include <netdb.h>
+
+typedef int ortp_socket_t;
+typedef pthread_t ortp_thread_t;
+typedef pthread_mutex_t ortp_mutex_t;
+typedef pthread_cond_t ortp_cond_t;
+
+#ifdef __INTEL_COMPILER
+#pragma warning(disable : 111)		// statement is unreachable
+#pragma warning(disable : 181)		// argument is incompatible with corresponding format string conversion
+#pragma warning(disable : 188)		// enumerated type mixed with another type
+#pragma warning(disable : 593)		// variable "xxx" was set but never used
+#pragma warning(disable : 810)		// conversion from "int" to "unsigned short" may lose significant bits
+#pragma warning(disable : 869)		// parameter "xxx" was never referenced
+#pragma warning(disable : 981)		// operands are evaluated in unspecified order
+#pragma warning(disable : 1418)		// external function definition with no prior declaration
+#pragma warning(disable : 1419)		// external declaration in primary source file
+#pragma warning(disable : 1469)		// "cc" clobber ignored
+#endif
+
+#define ORTP_PUBLIC
+#define ORTP_INLINE			inline
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+int __ortp_thread_join(ortp_thread_t thread, void **ptr);
+int __ortp_thread_create(ortp_thread_t *thread, pthread_attr_t *attr, void * (*routine)(void*), void *arg);
+unsigned long __ortp_thread_self(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define ortp_thread_create	__ortp_thread_create
+#define ortp_thread_join	__ortp_thread_join
+#define ortp_thread_self	__ortp_thread_self
+#define ortp_thread_exit	pthread_exit
+#define ortp_mutex_init		pthread_mutex_init
+#define ortp_mutex_lock		pthread_mutex_lock
+#define ortp_mutex_unlock	pthread_mutex_unlock
+#define ortp_mutex_destroy	pthread_mutex_destroy
+#define ortp_cond_init		pthread_cond_init
+#define ortp_cond_signal	pthread_cond_signal
+#define ortp_cond_broadcast	pthread_cond_broadcast
+#define ortp_cond_wait		pthread_cond_wait
+#define ortp_cond_destroy	pthread_cond_destroy
+
+#define SOCKET_OPTION_VALUE	void *
+#define SOCKET_BUFFER		void *
+
+#define getSocketError() strerror(errno)
+#define getSocketErrorCode() (errno)
+#define ortp_gettimeofday(tv,tz) gettimeofday(tv,tz)
+#define ortp_log10f(x)	log10f(x)
+
+
+#else
+/*********************************/
+/* definitions for WIN32 flavour */
+/*********************************/
+
+#include <stdio.h>
+#define _CRT_RAND_S
+#include <stdlib.h>
+#include <stdarg.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+#ifdef _MSC_VER
+#include <io.h>
+#endif
+
+#if defined(__MINGW32__) || !defined(WINAPI_FAMILY_PARTITION) || !defined(WINAPI_PARTITION_DESKTOP)
+#define ORTP_WINDOWS_DESKTOP 1
+#elif defined(WINAPI_FAMILY_PARTITION)
+#if defined(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+#define ORTP_WINDOWS_DESKTOP 1
+#elif defined(WINAPI_PARTITION_PHONE_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
+#define ORTP_WINDOWS_PHONE 1
+#elif defined(WINAPI_PARTITION_APP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+#define ORTP_WINDOWS_UNIVERSAL 1
+#endif
+#endif
+
+#ifdef _MSC_VER
+#ifdef ORTP_STATIC
+#define ORTP_PUBLIC
+#else
+#ifdef ORTP_EXPORTS
+#define ORTP_PUBLIC	__declspec(dllexport)
+#else
+#define ORTP_PUBLIC	__declspec(dllimport)
+#endif
+#endif
+#pragma push_macro("_WINSOCKAPI_")
+#ifndef _WINSOCKAPI_
+#define _WINSOCKAPI_
+#endif
+
+typedef  unsigned __int64 uint64_t;
+typedef  __int64 int64_t;
+typedef  unsigned short uint16_t;
+typedef  unsigned int uint32_t;
+typedef  int int32_t;
+typedef  unsigned char uint8_t;
+typedef __int16 int16_t;
+#else
+#include <stdint.h> /*provided by mingw32*/
+#include <io.h>
+#define ORTP_PUBLIC
+ORTP_PUBLIC char* strtok_r(char *str, const char *delim, char **nextp);
+#endif
+
+#define vsnprintf	_vsnprintf
+
+typedef SOCKET ortp_socket_t;
+#ifdef ORTP_WINDOWS_DESKTOP
+typedef HANDLE ortp_cond_t;
+typedef HANDLE ortp_mutex_t;
+#else
+typedef CONDITION_VARIABLE ortp_cond_t;
+typedef SRWLOCK ortp_mutex_t;
+#endif
+typedef HANDLE ortp_thread_t;
+
+#define ortp_thread_create	WIN_thread_create
+#define ortp_thread_join	WIN_thread_join
+#define ortp_thread_self	WIN_thread_self
+#define ortp_thread_exit(arg)
+#define ortp_mutex_init		WIN_mutex_init
+#define ortp_mutex_lock		WIN_mutex_lock
+#define ortp_mutex_unlock	WIN_mutex_unlock
+#define ortp_mutex_destroy	WIN_mutex_destroy
+#define ortp_cond_init		WIN_cond_init
+#define ortp_cond_signal	WIN_cond_signal
+#define ortp_cond_broadcast	WIN_cond_broadcast
+#define ortp_cond_wait		WIN_cond_wait
+#define ortp_cond_destroy	WIN_cond_destroy
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ORTP_PUBLIC int WIN_mutex_init(ortp_mutex_t *m, void *attr_unused);
+ORTP_PUBLIC int WIN_mutex_lock(ortp_mutex_t *mutex);
+ORTP_PUBLIC int WIN_mutex_unlock(ortp_mutex_t *mutex);
+ORTP_PUBLIC int WIN_mutex_destroy(ortp_mutex_t *mutex);
+ORTP_PUBLIC int WIN_thread_create(ortp_thread_t *t, void *attr_unused, void *(*func)(void*), void *arg);
+ORTP_PUBLIC int WIN_thread_join(ortp_thread_t thread, void **unused);
+ORTP_PUBLIC unsigned long WIN_thread_self(void);
+ORTP_PUBLIC int WIN_cond_init(ortp_cond_t *cond, void *attr_unused);
+ORTP_PUBLIC int WIN_cond_wait(ortp_cond_t * cond, ortp_mutex_t * mutex);
+ORTP_PUBLIC int WIN_cond_signal(ortp_cond_t * cond);
+ORTP_PUBLIC int WIN_cond_broadcast(ortp_cond_t * cond);
+ORTP_PUBLIC int WIN_cond_destroy(ortp_cond_t * cond);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define SOCKET_OPTION_VALUE	char *
+#define ORTP_INLINE			__inline
+
+#if defined(_WIN32_WCE)
+
+#define ortp_log10f(x)		(float)log10 ((double)x)
+
+#ifdef assert
+	#undef assert
+#endif /*assert*/
+#define assert(exp)	((void)0)
+
+#ifdef errno
+	#undef errno
+#endif /*errno*/
+#define  errno GetLastError()
+#ifdef strerror
+		#undef strerror
+#endif /*strerror*/
+const char * ortp_strerror(DWORD value);
+#define strerror ortp_strerror
+
+
+#else /*_WIN32_WCE*/
+
+#define ortp_log10f(x)	log10f(x)
+
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+	
+	ORTP_PUBLIC const char *getWinSocketError(int error);
+#ifndef getSocketErrorCode
+#define getSocketErrorCode() WSAGetLastError()
+#endif
+#ifndef getSocketError
+#define getSocketError() getWinSocketError(WSAGetLastError())
+#endif
+
+#ifndef F_OK
+#define F_OK 00 /* Visual Studio does not define F_OK */
+#endif
+
+
+ORTP_PUBLIC int ortp_gettimeofday (struct timeval *tv, void* tz);
+#ifdef _WORKAROUND_MINGW32_BUGS
+char * WSAAPI gai_strerror(int errnum);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#ifndef _BOOL_T_
+#define _BOOL_T_
+typedef unsigned char bool_t;
+#endif /* _BOOL_T_ */
+#undef TRUE
+#undef FALSE
+#define TRUE 1
+#define FALSE 0
+
+
+typedef struct ortpTimeSpec{
+	int64_t tv_sec;
+	int64_t tv_nsec;
+}ortpTimeSpec;
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+ORTP_PUBLIC void* ortp_malloc(size_t sz);
+ORTP_PUBLIC void ortp_free(void *ptr);
+ORTP_PUBLIC void* ortp_realloc(void *ptr, size_t sz);
+ORTP_PUBLIC void* ortp_malloc0(size_t sz);
+ORTP_PUBLIC char * ortp_strdup(const char *tmp);
+
+/*override the allocator with this method, to be called BEFORE ortp_init()*/
+typedef struct _OrtpMemoryFunctions{
+	void *(*malloc_fun)(size_t sz);
+	void *(*realloc_fun)(void *ptr, size_t sz);
+	void (*free_fun)(void *ptr);
+}OrtpMemoryFunctions;
+
+void ortp_set_memory_functions(OrtpMemoryFunctions *functions);
+
+#define ortp_new(type,count)	(type*)ortp_malloc(sizeof(type)*(count))
+#define ortp_new0(type,count)	(type*)ortp_malloc0(sizeof(type)*(count))
+
+ORTP_PUBLIC int close_socket(ortp_socket_t sock);
+ORTP_PUBLIC int set_non_blocking_socket(ortp_socket_t sock);
+
+ORTP_PUBLIC char *ortp_strndup(const char *str,int n);
+#define ortp_strdup_printf bctbx_strdup_printf
+/*ORTP_PUBLIC char *ortp_strdup_printf(const char *fmt,...);*/
+#define ortp_strdup_vprintf bctbx_strdup_vprintf
+/*ORTP_PUBLIC char *ortp_strdup_vprintf(const char *fmt, va_list ap);*/
+#define ortp_strcat_printf bctbx_strcat_printf
+/*ORTP_PUBLIC char *ortp_strcat_printf(char *dst, const char *fmt,...);*/
+
+ORTP_PUBLIC char *ortp_strcat_vprintf(char *dst, const char *fmt, va_list ap);
+
+ORTP_PUBLIC int ortp_file_exist(const char *pathname);
+
+ORTP_PUBLIC void ortp_get_cur_time(ortpTimeSpec *ret);
+void _ortp_get_cur_time(ortpTimeSpec *ret, bool_t realtime);
+ORTP_PUBLIC uint64_t ortp_get_cur_time_ms(void);
+ORTP_PUBLIC void ortp_sleep_ms(int ms);
+ORTP_PUBLIC void ortp_sleep_until(const ortpTimeSpec *ts);
+ORTP_PUBLIC int ortp_timespec_compare(const ortpTimeSpec *s1, const ortpTimeSpec *s2);
+ORTP_PUBLIC unsigned int ortp_random(void);
+
+/* portable named pipes  and shared memory*/
+#if !defined(_WIN32_WCE)
+#ifdef _WIN32
+typedef HANDLE ortp_pipe_t;
+#define ORTP_PIPE_INVALID INVALID_HANDLE_VALUE
+#else
+typedef int ortp_pipe_t;
+#define ORTP_PIPE_INVALID (-1)
+#endif
+
+ORTP_PUBLIC ortp_pipe_t ortp_server_pipe_create(const char *name);
+/*
+ * warning: on win32 ortp_server_pipe_accept_client() might return INVALID_HANDLE_VALUE without
+ * any specific error, this happens when ortp_server_pipe_close() is called on another pipe.
+ * This pipe api is not thread-safe.
+*/
+ORTP_PUBLIC ortp_pipe_t ortp_server_pipe_accept_client(ortp_pipe_t server);
+ORTP_PUBLIC int ortp_server_pipe_close(ortp_pipe_t spipe);
+ORTP_PUBLIC int ortp_server_pipe_close_client(ortp_pipe_t client);
+
+ORTP_PUBLIC ortp_pipe_t ortp_client_pipe_connect(const char *name);
+ORTP_PUBLIC int ortp_client_pipe_close(ortp_pipe_t sock);
+
+ORTP_PUBLIC int ortp_pipe_read(ortp_pipe_t p, uint8_t *buf, int len);
+ORTP_PUBLIC int ortp_pipe_write(ortp_pipe_t p, const uint8_t *buf, int len);
+
+ORTP_PUBLIC void *ortp_shm_open(unsigned int keyid, int size, int create);
+ORTP_PUBLIC void ortp_shm_close(void *memory);
+
+ORTP_PUBLIC	bool_t ortp_is_multicast_addr(const struct sockaddr *addr);
+	
+	
+#endif
+
+#ifdef __cplusplus
+}
+
+#endif
+
+
+#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(ORTP_STATIC)
+#ifdef ORTP_EXPORTS
+   #define ORTP_VAR_PUBLIC    extern __declspec(dllexport)
+#else
+   #define ORTP_VAR_PUBLIC    __declspec(dllimport)
+#endif
+#else
+   #define ORTP_VAR_PUBLIC    extern
+#endif
+
+#ifndef IN6_IS_ADDR_MULTICAST
+#define IN6_IS_ADDR_MULTICAST(i)	(((uint8_t *) (i))[0] == 0xff)
+#endif
+
+/*define __ios when we are compiling for ios.
+ The TARGET_OS_IPHONE macro is stupid, it is defined to 0 when compiling on mac os x.
+*/
+#if TARGET_OS_IPHONE
+#define __ios 1
+#endif
+
+#endif
+
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtcp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtcp.h"
new file mode 100755
index 0000000..645d1aa
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtcp.h"
@@ -0,0 +1,583 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef RTCP_H
+#define RTCP_H
+
+#include <ortp/port.h>
+
+#define RTCP_MAX_RECV_BUFSIZE 1500
+
+#define RTCP_SENDER_INFO_SIZE 20
+#define RTCP_REPORT_BLOCK_SIZE 24
+#define RTCP_COMMON_HEADER_SIZE 4
+#define RTCP_SSRC_FIELD_SIZE 4
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/* RTCP common header */
+
+typedef enum {
+	RTCP_SR = 200,
+	RTCP_RR = 201,
+	RTCP_SDES = 202,
+	RTCP_BYE = 203,
+	RTCP_APP = 204,
+	RTCP_RTPFB = 205,
+	RTCP_PSFB = 206,
+	RTCP_XR = 207
+} rtcp_type_t;
+
+
+typedef struct rtcp_common_header
+{
+#ifdef ORTP_BIGENDIAN
+	uint16_t version:2;
+	uint16_t padbit:1;
+	uint16_t rc:5;
+	uint16_t packet_type:8;
+#else
+	uint16_t rc:5;
+	uint16_t padbit:1;
+	uint16_t version:2;
+	uint16_t packet_type:8;
+#endif
+	uint16_t length:16;
+} rtcp_common_header_t;
+
+#define rtcp_common_header_set_version(ch,v) (ch)->version=v
+#define rtcp_common_header_set_padbit(ch,p) (ch)->padbit=p
+#define rtcp_common_header_set_rc(ch,rc) (ch)->rc=rc
+#define rtcp_common_header_set_packet_type(ch,pt) (ch)->packet_type=pt
+#define rtcp_common_header_set_length(ch,l)	(ch)->length=htons(l)
+
+#define rtcp_common_header_get_version(ch) ((ch)->version)
+#define rtcp_common_header_get_padbit(ch) ((ch)->padbit)
+#define rtcp_common_header_get_rc(ch) ((ch)->rc)
+#define rtcp_common_header_get_packet_type(ch) ((ch)->packet_type)
+#define rtcp_common_header_get_length(ch)	ntohs((ch)->length)
+
+
+/* RTCP SR or RR  packets */
+
+typedef struct sender_info
+{
+	uint32_t ntp_timestamp_msw;
+	uint32_t ntp_timestamp_lsw;
+	uint32_t rtp_timestamp;
+	uint32_t senders_packet_count;
+	uint32_t senders_octet_count;
+} sender_info_t;
+
+static ORTP_INLINE uint64_t sender_info_get_ntp_timestamp(const sender_info_t *si) {
+  return ((((uint64_t)ntohl(si->ntp_timestamp_msw)) << 32) +
+          ((uint64_t) ntohl(si->ntp_timestamp_lsw)));
+}
+#define sender_info_get_rtp_timestamp(si)	ntohl((si)->rtp_timestamp)
+#define sender_info_get_packet_count(si) \
+	ntohl((si)->senders_packet_count)
+#define sender_info_get_octet_count(si) \
+	ntohl((si)->senders_octet_count)
+
+
+typedef struct report_block
+{
+	uint32_t ssrc;
+	uint32_t fl_cnpl;/*fraction lost + cumulative number of packet lost*/
+	uint32_t ext_high_seq_num_rec; /*extended highest sequence number received */
+	uint32_t interarrival_jitter;
+	uint32_t lsr; /*last SR */
+	uint32_t delay_snc_last_sr; /*delay since last sr*/
+} report_block_t;
+
+static ORTP_INLINE uint32_t report_block_get_ssrc(const report_block_t * rb) {
+	return ntohl(rb->ssrc);
+}
+static ORTP_INLINE uint32_t report_block_get_high_ext_seq(const report_block_t * rb) {
+	return ntohl(rb->ext_high_seq_num_rec);
+}
+static ORTP_INLINE uint32_t report_block_get_interarrival_jitter(const report_block_t * rb) {
+	return ntohl(rb->interarrival_jitter);
+}
+
+static ORTP_INLINE uint32_t report_block_get_last_SR_time(const report_block_t * rb) {
+	return ntohl(rb->lsr);
+}
+static ORTP_INLINE uint32_t report_block_get_last_SR_delay(const report_block_t * rb) {
+	return ntohl(rb->delay_snc_last_sr);
+}
+static ORTP_INLINE uint32_t report_block_get_fraction_lost(const report_block_t * rb) {
+	return (ntohl(rb->fl_cnpl)>>24);
+}
+static ORTP_INLINE int32_t report_block_get_cum_packet_lost(const report_block_t * rb){
+	uint32_t cum_loss = (uint32_t)ntohl(rb->fl_cnpl);
+	if (((cum_loss>>23)&1)==0)
+		return (int32_t) (0x00FFFFFF & cum_loss);
+	else
+		return (int32_t)(0xFF000000 | (cum_loss-0xFFFFFF-1));
+}
+
+static ORTP_INLINE void report_block_set_fraction_lost(report_block_t * rb, int fl){
+	rb->fl_cnpl = (uint32_t)htonl( ((uint32_t)ntohl(rb->fl_cnpl) & 0xFFFFFF) | ((uint32_t)fl&0xFF)<<24);
+}
+
+static ORTP_INLINE void report_block_set_cum_packet_lost(report_block_t * rb, int64_t cpl) {
+	uint32_t clamp = (uint32_t)((1<<24) + ((cpl>=0) ? (cpl>0x7FFFFF?0x7FFFFF:cpl) : (-cpl>0x800000?-0x800000:cpl)));
+
+	rb->fl_cnpl=htonl(
+			(ntohl(rb->fl_cnpl) & 0xFF000000) |
+			(cpl >= 0 ? clamp&0x7FFFFF : clamp|0x800000)
+		);
+}
+
+/* SDES packets */
+
+typedef enum {
+	RTCP_SDES_END = 0,
+	RTCP_SDES_CNAME = 1,
+	RTCP_SDES_NAME = 2,
+	RTCP_SDES_EMAIL = 3,
+	RTCP_SDES_PHONE = 4,
+	RTCP_SDES_LOC = 5,
+	RTCP_SDES_TOOL = 6,
+	RTCP_SDES_NOTE = 7,
+	RTCP_SDES_PRIV = 8,
+	RTCP_SDES_MAX = 9
+} rtcp_sdes_type_t;
+
+typedef struct sdes_chunk
+{
+	uint32_t csrc;
+} sdes_chunk_t;
+
+
+#define sdes_chunk_get_csrc(c)	ntohl((c)->csrc)
+
+typedef struct sdes_item
+{
+	uint8_t item_type;
+	uint8_t len;
+	char content[1];
+} sdes_item_t;
+
+#define RTCP_SDES_MAX_STRING_SIZE 255
+#define RTCP_SDES_ITEM_HEADER_SIZE 2
+#define RTCP_SDES_CHUNK_DEFAULT_SIZE 1024
+#define RTCP_SDES_CHUNK_HEADER_SIZE (sizeof(sdes_chunk_t))
+
+/* RTCP bye packet */
+
+typedef struct rtcp_bye_reason
+{
+	uint8_t len;
+	char content[1];
+} rtcp_bye_reason_t;
+
+typedef struct rtcp_bye
+{
+	rtcp_common_header_t ch;
+	uint32_t ssrc[1];  /* the bye may contain several ssrc/csrc */
+} rtcp_bye_t;
+#define RTCP_BYE_HEADER_SIZE sizeof(rtcp_bye_t)
+#define RTCP_BYE_REASON_MAX_STRING_SIZE 255
+
+
+/* RTCP XR packet */
+
+#define RTCP_XR_VOIP_METRICS_CONFIG_PLC_STD ((1 << 7) | (1 << 6))
+#define RTCP_XR_VOIP_METRICS_CONFIG_PLC_ENH (1 << 7)
+#define RTCP_XR_VOIP_METRICS_CONFIG_PLC_DIS (1 << 6)
+#define RTCP_XR_VOIP_METRICS_CONFIG_PLC_UNS 0
+#define RTCP_XR_VOIP_METRICS_CONFIG_JBA_ADA ((1 << 5) | (1 << 4))
+#define RTCP_XR_VOIP_METRICS_CONFIG_JBA_NON (1 << 5)
+#define RTCP_XR_VOIP_METRICS_CONFIG_JBA_UNK 0
+
+typedef enum {
+	RTCP_XR_LOSS_RLE = 1,
+	RTCP_XR_DUPLICATE_RLE = 2,
+	RTCP_XR_PACKET_RECEIPT_TIMES = 3,
+	RTCP_XR_RCVR_RTT = 4,
+	RTCP_XR_DLRR = 5,
+	RTCP_XR_STAT_SUMMARY = 6,
+	RTCP_XR_VOIP_METRICS = 7
+} rtcp_xr_block_type_t;
+
+typedef struct rtcp_xr_header {
+	rtcp_common_header_t ch;
+	uint32_t ssrc;
+} rtcp_xr_header_t;
+
+typedef struct rtcp_xr_generic_block_header {
+	uint8_t bt;
+	uint8_t flags;
+	uint16_t length;
+} rtcp_xr_generic_block_header_t;
+
+typedef struct rtcp_xr_rcvr_rtt_report_block {
+	rtcp_xr_generic_block_header_t bh;
+	uint32_t ntp_timestamp_msw;
+	uint32_t ntp_timestamp_lsw;
+} rtcp_xr_rcvr_rtt_report_block_t;
+
+typedef struct rtcp_xr_dlrr_report_subblock {
+	uint32_t ssrc;
+	uint32_t lrr;
+	uint32_t dlrr;
+} rtcp_xr_dlrr_report_subblock_t;
+
+typedef struct rtcp_xr_dlrr_report_block {
+	rtcp_xr_generic_block_header_t bh;
+	rtcp_xr_dlrr_report_subblock_t content[1];
+} rtcp_xr_dlrr_report_block_t;
+
+typedef struct rtcp_xr_stat_summary_report_block {
+	rtcp_xr_generic_block_header_t bh;
+	uint32_t ssrc;
+	uint16_t begin_seq;
+	uint16_t end_seq;
+	uint32_t lost_packets;
+	uint32_t dup_packets;
+	uint32_t min_jitter;
+	uint32_t max_jitter;
+	uint32_t mean_jitter;
+	uint32_t dev_jitter;
+	uint8_t min_ttl_or_hl;
+	uint8_t max_ttl_or_hl;
+	uint8_t mean_ttl_or_hl;
+	uint8_t dev_ttl_or_hl;
+} rtcp_xr_stat_summary_report_block_t;
+
+typedef struct rtcp_xr_voip_metrics_report_block {
+	rtcp_xr_generic_block_header_t bh;
+	uint32_t ssrc;
+	uint8_t loss_rate;
+	uint8_t discard_rate;
+	uint8_t burst_density;
+	uint8_t gap_density;
+	uint16_t burst_duration;
+	uint16_t gap_duration;
+	uint16_t round_trip_delay;
+	uint16_t end_system_delay;
+	uint8_t signal_level;
+	uint8_t noise_level;
+	uint8_t rerl;
+	uint8_t gmin;
+	uint8_t r_factor;
+	uint8_t ext_r_factor;
+	uint8_t mos_lq;
+	uint8_t mos_cq;
+	uint8_t rx_config;
+	uint8_t reserved2;
+	uint16_t jb_nominal;
+	uint16_t jb_maximum;
+	uint16_t jb_abs_max;
+} rtcp_xr_voip_metrics_report_block_t;
+
+#define MIN_RTCP_XR_PACKET_SIZE (sizeof(rtcp_xr_header_t) + 4)
+
+/* RTCP FB packet */
+typedef enum {
+	RTCP_RTPFB_NACK = 1,
+	RTCP_RTPFB_TMMBR = 3,
+	RTCP_RTPFB_TMMBN = 4
+} rtcp_rtpfb_type_t;
+
+typedef enum {
+	RTCP_PSFB_PLI = 1,
+	RTCP_PSFB_SLI = 2,
+	RTCP_PSFB_RPSI = 3,
+	RTCP_PSFB_FIR = 4,
+	RTCP_PSFB_AFB = 15
+} rtcp_psfb_type_t;
+
+typedef struct rtcp_fb_header {
+	uint32_t packet_sender_ssrc;
+	uint32_t media_source_ssrc;
+} rtcp_fb_header_t;
+
+typedef struct rtcp_fb_generic_nack_fci {
+	uint16_t pid;
+	uint16_t blp;
+} rtcp_fb_generic_nack_fci_t;
+
+#define rtcp_fb_generic_nack_fci_get_pid(nack) ntohs((nack)->pid)
+#define rtcp_fb_generic_nack_fci_set_pid(nack, value) ((nack)->pid) = htons(value)
+#define rtcp_fb_generic_nack_fci_get_blp(nack) ntohs((nack)->blp)
+#define rtcp_fb_generic_nack_fci_set_blp(nack, value) ((nack)->blp) = htons(value)
+
+typedef struct rtcp_fb_tmmbr_fci {
+	uint32_t ssrc;
+	uint32_t value;
+} rtcp_fb_tmmbr_fci_t;
+
+#define rtcp_fb_tmmbr_fci_get_ssrc(tmmbr) ntohl((tmmbr)->ssrc)
+#define rtcp_fb_tmmbr_fci_get_mxtbr_exp(tmmbr) \
+	((uint8_t)((ntohl((tmmbr)->value) >> 26) & 0x0000003F))
+#define rtcp_fb_tmmbr_fci_set_mxtbr_exp(tmmbr, mxtbr_exp) \
+	((tmmbr)->value) = htonl((ntohl((tmmbr)->value) & 0x03FFFFFF) | (((mxtbr_exp) & 0x0000003F) << 26))
+#define rtcp_fb_tmmbr_fci_get_mxtbr_mantissa(tmmbr) \
+	((uint32_t)((ntohl((tmmbr)->value) >> 9) & 0x0001FFFF))
+#define rtcp_fb_tmmbr_fci_set_mxtbr_mantissa(tmmbr, mxtbr_mantissa) \
+	((tmmbr)->value) = htonl((ntohl((tmmbr)->value) & 0xFC0001FF) | (((mxtbr_mantissa) & 0x0001FFFF) << 9))
+#define rtcp_fb_tmmbr_fci_get_measured_overhead(tmmbr) \
+	((uint16_t)(ntohl((tmmbr)->value) & 0x000001FF))
+#define rtcp_fb_tmmbr_fci_set_measured_overhead(tmmbr, measured_overhead) \
+	((tmmbr)->value) = htonl((ntohl((tmmbr)->value) & 0xFFFFFE00) | ((measured_overhead) & 0x000001FF))
+
+typedef struct rtcp_fb_fir_fci {
+	uint32_t ssrc;
+	uint8_t seq_nr;
+	uint8_t pad1;
+	uint16_t pad2;
+} rtcp_fb_fir_fci_t;
+
+#define rtcp_fb_fir_fci_get_ssrc(fci) ntohl((fci)->ssrc)
+#define rtcp_fb_fir_fci_get_seq_nr(fci) (fci)->seq_nr
+
+typedef struct rtcp_fb_sli_fci {
+	uint32_t value;
+} rtcp_fb_sli_fci_t;
+
+#define rtcp_fb_sli_fci_get_first(fci) \
+	((uint16_t)((ntohl((fci)->value) >> 19) & 0x00001FFF))
+#define rtcp_fb_sli_fci_set_first(fci, first) \
+	((fci)->value) = htonl((ntohl((fci)->value) & 0x0007FFFF) | (((first) & 0x00001FFF) << 19))
+#define rtcp_fb_sli_fci_get_number(fci) \
+	((uint16_t)((ntohl((fci)->value) >> 6) & 0x00001FFF))
+#define rtcp_fb_sli_fci_set_number(fci, number) \
+	((fci)->value) = htonl((ntohl((fci)->value) & 0xFFF8003F) | (((number) & 0x00001FFF) << 6))
+#define rtcp_fb_sli_fci_get_picture_id(fci) \
+	((uint8_t)(ntohl((fci)->value) & 0x0000003F))
+#define rtcp_fb_sli_fci_set_picture_id(fci, picture_id) \
+	((fci)->value) = htonl((ntohl((fci)->value) & 0xFFFFFFC0) | ((picture_id) & 0x0000003F))
+
+typedef struct rtcp_fb_rpsi_fci {
+	uint8_t pb;
+	uint8_t payload_type;
+	uint16_t bit_string[1];
+} rtcp_fb_rpsi_fci_t;
+
+#define rtcp_fb_rpsi_fci_get_payload_type(fci) (fci)->payload_type
+#define rtcp_fb_rpsi_fci_get_bit_string(fci) ((uint8_t *)(fci)->bit_string)
+
+#define MIN_RTCP_PSFB_PACKET_SIZE (sizeof(rtcp_common_header_t) + sizeof(rtcp_fb_header_t))
+#define MIN_RTCP_RTPFB_PACKET_SIZE (sizeof(rtcp_common_header_t) + sizeof(rtcp_fb_header_t))
+
+/* RTCP structs */
+
+typedef struct rtcp_sr{
+	rtcp_common_header_t ch;
+	uint32_t ssrc;
+	sender_info_t si;
+	report_block_t rb[1];
+} rtcp_sr_t;
+
+typedef struct rtcp_rr{
+	rtcp_common_header_t ch;
+	uint32_t ssrc;
+	report_block_t rb[1];
+} rtcp_rr_t;
+
+typedef struct rtcp_app{
+	rtcp_common_header_t ch;
+	uint32_t ssrc;
+	char name[4];
+} rtcp_app_t;
+
+struct _RtpSession;
+struct _RtpStream;
+ORTP_PUBLIC void rtp_session_rtcp_process_send(struct _RtpSession *s);
+ORTP_PUBLIC void rtp_session_rtcp_process_recv(struct _RtpSession *s);
+
+
+#define RTCP_DEFAULT_REPORT_INTERVAL 5000 /* in milliseconds */
+
+
+/* packet parsing api */
+
+/*in case of coumpound packet, set read pointer of m to the beginning of the next RTCP
+packet */
+ORTP_PUBLIC bool_t rtcp_next_packet(mblk_t *m);
+/* put the read pointer at the first RTCP packet of the compound packet (as before any previous calls ot rtcp_next_packet() */
+ORTP_PUBLIC void rtcp_rewind(mblk_t *m);
+/* get common header*/
+ORTP_PUBLIC const rtcp_common_header_t * rtcp_get_common_header(const mblk_t *m);
+
+/*Sender Report accessors */
+/* check if this packet is a SR and if it is correct */
+ORTP_PUBLIC bool_t rtcp_is_SR(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_SR_get_ssrc(const mblk_t *m);
+ORTP_PUBLIC const sender_info_t * rtcp_SR_get_sender_info(const mblk_t *m);
+ORTP_PUBLIC const report_block_t * rtcp_SR_get_report_block(const mblk_t *m, int idx);
+
+/*Receiver report accessors*/
+ORTP_PUBLIC bool_t rtcp_is_RR(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_RR_get_ssrc(const mblk_t *m);
+ORTP_PUBLIC const report_block_t * rtcp_RR_get_report_block(const mblk_t *m,int idx);
+
+/*SDES accessors */
+ORTP_PUBLIC bool_t rtcp_is_SDES(const mblk_t *m);
+typedef void (*SdesItemFoundCallback)(void *user_data, uint32_t csrc, rtcp_sdes_type_t t, const char *content, uint8_t content_len);
+ORTP_PUBLIC void rtcp_sdes_parse(const mblk_t *m, SdesItemFoundCallback cb, void *user_data);
+
+/*BYE accessors */
+ORTP_PUBLIC bool_t rtcp_is_BYE(const mblk_t *m);
+ORTP_PUBLIC bool_t rtcp_BYE_get_ssrc(const mblk_t *m, int idx, uint32_t *ssrc);
+ORTP_PUBLIC bool_t rtcp_BYE_get_reason(const mblk_t *m, const char **reason, int *reason_len);
+
+/*APP accessors */
+ORTP_PUBLIC bool_t rtcp_is_APP(const mblk_t *m);
+ORTP_PUBLIC int rtcp_APP_get_subtype(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_APP_get_ssrc(const mblk_t *m);
+/* name argument is supposed to be at least 4 characters (note: no '\0' written)*/
+ORTP_PUBLIC void rtcp_APP_get_name(const mblk_t *m, char *name);
+/* retrieve the data. when returning, data points directly into the mblk_t */
+ORTP_PUBLIC void rtcp_APP_get_data(const mblk_t *m, uint8_t **data, int *len);
+
+/* RTCP XR accessors */
+ORTP_PUBLIC bool_t rtcp_is_XR(const mblk_t *m);
+ORTP_PUBLIC rtcp_xr_block_type_t rtcp_XR_get_block_type(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_get_ssrc(const mblk_t *m);
+ORTP_PUBLIC uint64_t rtcp_XR_rcvr_rtt_get_ntp_timestamp(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_dlrr_get_ssrc(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_dlrr_get_lrr(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_dlrr_get_dlrr(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_stat_summary_get_flags(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_stat_summary_get_ssrc(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_stat_summary_get_begin_seq(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_stat_summary_get_end_seq(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_stat_summary_get_lost_packets(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_stat_summary_get_dup_packets(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_stat_summary_get_min_jitter(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_stat_summary_get_max_jitter(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_stat_summary_get_mean_jitter(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_stat_summary_get_dev_jitter(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_stat_summary_get_min_ttl_or_hl(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_stat_summary_get_max_ttl_or_hl(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_stat_summary_get_mean_ttl_or_hl(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_stat_summary_get_dev_ttl_or_hl(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_XR_voip_metrics_get_ssrc(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_loss_rate(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_discard_rate(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_burst_density(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_gap_density(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_voip_metrics_get_burst_duration(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_voip_metrics_get_gap_duration(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_voip_metrics_get_round_trip_delay(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_voip_metrics_get_end_system_delay(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_signal_level(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_noise_level(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_rerl(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_gmin(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_r_factor(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_ext_r_factor(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_mos_lq(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_mos_cq(const mblk_t *m);
+ORTP_PUBLIC uint8_t rtcp_XR_voip_metrics_get_rx_config(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_voip_metrics_get_jb_nominal(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_voip_metrics_get_jb_maximum(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_XR_voip_metrics_get_jb_abs_max(const mblk_t *m);
+
+/* RTCP RTPFB accessors */
+ORTP_PUBLIC bool_t rtcp_is_RTPFB(const mblk_t *m);
+ORTP_PUBLIC rtcp_rtpfb_type_t rtcp_RTPFB_get_type(const mblk_t *m);
+ORTP_PUBLIC rtcp_fb_generic_nack_fci_t * rtcp_RTPFB_generic_nack_get_fci(const mblk_t *m);
+ORTP_PUBLIC rtcp_fb_tmmbr_fci_t * rtcp_RTPFB_tmmbr_get_fci(const mblk_t *m);
+/**
+ * Return the maximum bitrate in bits / sec contained in the packet.
+ *
+ * @param m RTCP TMMBR packet to read
+ * @return maximum bitrate in bits / sec.
+ */
+ORTP_PUBLIC uint64_t rtcp_RTPFB_tmmbr_get_max_bitrate(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_RTPFB_get_packet_sender_ssrc(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_RTPFB_get_media_source_ssrc(const mblk_t *m);
+
+/* RTCP PSFB accessors */
+ORTP_PUBLIC bool_t rtcp_is_PSFB(const mblk_t *m);
+ORTP_PUBLIC rtcp_psfb_type_t rtcp_PSFB_get_type(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_PSFB_get_packet_sender_ssrc(const mblk_t *m);
+ORTP_PUBLIC uint32_t rtcp_PSFB_get_media_source_ssrc(const mblk_t *m);
+ORTP_PUBLIC rtcp_fb_fir_fci_t * rtcp_PSFB_fir_get_fci(const mblk_t *m, unsigned int idx);
+ORTP_PUBLIC rtcp_fb_sli_fci_t * rtcp_PSFB_sli_get_fci(const mblk_t *m, unsigned int idx);
+ORTP_PUBLIC rtcp_fb_rpsi_fci_t * rtcp_PSFB_rpsi_get_fci(const mblk_t *m);
+ORTP_PUBLIC uint16_t rtcp_PSFB_rpsi_get_fci_bit_string_len(const mblk_t *m);
+
+
+typedef struct OrtpLossRateEstimator{
+	int min_packet_count_interval;
+	uint64_t min_time_ms_interval;
+	uint64_t last_estimate_time_ms;
+	int32_t last_cum_loss;
+	int32_t last_ext_seq;
+	float loss_rate;
+	/**
+	* Total number of outgoing duplicate packets on last
+	* ortp_loss_rate_estimator_process_report_block iteration.
+	**/
+	int64_t last_dup_packet_sent_count;
+	/**
+	* Total number of outgoing unique packets on last
+	* ortp_loss_rate_estimator_process_report_block iteration.
+	**/
+	int64_t last_packet_sent_count;
+}OrtpLossRateEstimator;
+
+
+ORTP_PUBLIC OrtpLossRateEstimator * ortp_loss_rate_estimator_new(int min_packet_count_interval, uint64_t min_time_ms_interval, struct _RtpSession *session);
+
+ORTP_PUBLIC void ortp_loss_rate_estimator_init(OrtpLossRateEstimator *obj, int min_packet_count_interval, uint64_t min_time_ms_interval, struct _RtpSession *session);
+
+
+/**
+ * Process an incoming report block to compute loss rate percentage. It tries to compute
+ * loss rate, depending on the previous report block. It may fails if the two
+ * reports are too close or if a discontinuity occurred. You should NOT use
+ * loss rate field of the report block directly (see below).
+ * This estimator is useful for two reasons: first, on AVPF session, multiple
+ * reports can be received in a short period and loss_rate contained in these
+ * reports is unreliable. Secondly, it computes the loss rate using the
+ * cumulative loss factor which allows us to take into consideration duplicates
+ * packets as well.
+ * @param[in] obj #OrtpLossRateEstimator object.
+ * @param[in] session #_RtpSession stream in which the report block to consider belongs.
+ * @param[in] rb Report block to analyze.
+ * @return TRUE if a new loss rate estimation is ready, FALSE otherwise.
+ */
+ORTP_PUBLIC bool_t ortp_loss_rate_estimator_process_report_block(OrtpLossRateEstimator *obj,
+																 const struct _RtpSession *session,
+																 const report_block_t *rb);
+/**
+ * Get the latest loss rate in percentage estimation computed.
+ *
+ * @param obj #OrtpLossRateEstimator object.
+ * @return The latest loss rate in percentage computed.
+ */
+ORTP_PUBLIC float ortp_loss_rate_estimator_get_value(OrtpLossRateEstimator *obj);
+
+ORTP_PUBLIC void ortp_loss_rate_estimator_destroy(OrtpLossRateEstimator *obj);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtp.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtp.h"
new file mode 100755
index 0000000..3fb3f7c
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtp.h"
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef RTP_H
+#define RTP_H
+
+#include <ortp/port.h>
+#include <ortp/str_utils.h>
+
+#define IPMAXLEN 20
+#define UDP_MAX_SIZE 1500
+#define RTP_FIXED_HEADER_SIZE 12
+#define RTP_DEFAULT_JITTER_TIME 80	/*miliseconds*/
+#define RTP_DEFAULT_MULTICAST_TTL 5	/*hops*/
+#define RTP_DEFAULT_MULTICAST_LOOPBACK 0  /*false*/
+#define RTP_DEFAULT_DSCP 0x00  /*best effort*/
+
+
+
+typedef struct rtp_header
+{
+#ifdef ORTP_BIGENDIAN
+	uint16_t version:2;
+	uint16_t padbit:1;
+	uint16_t extbit:1;
+	uint16_t cc:4;
+	uint16_t markbit:1;
+	uint16_t paytype:7;
+#else
+	uint16_t cc:4;
+	uint16_t extbit:1;
+	uint16_t padbit:1;
+	uint16_t version:2;
+	uint16_t paytype:7;
+	uint16_t markbit:1;
+#endif
+	uint16_t seq_number;
+	uint32_t timestamp;
+	uint32_t ssrc;
+	uint32_t csrc[16];
+} rtp_header_t;
+
+
+
+
+typedef struct rtp_stats
+{
+	uint64_t packet_sent;		/*number of outgoing packets */
+	uint64_t packet_dup_sent;	/*number of outgoing duplicate packets */
+	uint64_t sent;				/* outgoing total bytes (excluding IP header) */
+	uint64_t packet_recv;		/* number of incoming packets */
+	uint64_t packet_dup_recv;	/* number of incoming duplicate packets */
+	uint64_t recv;				/* incoming bytes of payload and delivered in time to the application */
+	uint64_t hw_recv;			/* incoming bytes of payload */
+	uint64_t outoftime;			/* number of incoming packets that were received too late */
+	int64_t  cum_packet_loss;	/* cumulative number of incoming packet lost */
+	uint64_t bad;				/* incoming packets that did not appear to be RTP */
+	uint64_t discarded;			/* incoming packets discarded because the queue exceeds its max size */
+	uint64_t sent_rtcp_packets;	/* outgoing RTCP packets counter (only packets that embed a report block are considered) */
+	uint64_t recv_rtcp_packets;	/* incoming RTCP packets counter (only packets that embed a report block are considered) */
+} rtp_stats_t;
+
+
+typedef struct jitter_stats
+{
+	uint32_t jitter;			/* interarrival jitter at last emitted sender report */
+	uint32_t max_jitter;		/* biggest interarrival jitter (value in stream clock unit) */
+	uint64_t sum_jitter;		/* sum of all interarrival jitter (value in stream clock unit) */
+	uint64_t max_jitter_ts;		/* date (in ms since Epoch) of the biggest interarrival jitter */
+	float jitter_buffer_size_ms;/* mean jitter buffer size in milliseconds.*/
+} jitter_stats_t;
+
+#define RTP_TIMESTAMP_IS_NEWER_THAN(ts1, ts2) \
+	((uint32_t)((uint32_t)(ts1) - (uint32_t)(ts2)) < ((uint32_t)1 << 31))
+
+#define RTP_TIMESTAMP_IS_STRICTLY_NEWER_THAN(ts1, ts2) \
+	(((uint32_t)((uint32_t)(ts1) - (uint32_t)(ts2)) < ((uint32_t)1 << 31)) && (ts1) != (ts2))
+
+#define RTP_SEQ_IS_STRICTLY_GREATER_THAN(seq1, seq2) \
+	(((uint16_t)((uint16_t)(seq1) - (uint16_t)(seq2)) < ((uint16_t)1 << 15)) && (seq1) != (seq2))
+
+#define TIME_IS_NEWER_THAN(t1,t2) RTP_TIMESTAMP_IS_NEWER_THAN(t1,t2)
+
+#define TIME_IS_STRICTLY_NEWER_THAN(t1,t2) RTP_TIMESTAMP_IS_STRICTLY_NEWER_THAN(t1,t2)
+
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+/* packet api */
+/* the first argument is a mblk_t. The header is supposed to be not splitted  */
+#define rtp_set_markbit(mp,value)		((rtp_header_t*)((mp)->b_rptr))->markbit=(value)
+#define rtp_set_seqnumber(mp,seq)	((rtp_header_t*)((mp)->b_rptr))->seq_number=(seq)
+#define rtp_set_timestamp(mp,ts)	((rtp_header_t*)((mp)->b_rptr))->timestamp=(ts)
+#define rtp_set_ssrc(mp,_ssrc)		((rtp_header_t*)((mp)->b_rptr))->ssrc=(_ssrc)
+ORTP_PUBLIC void rtp_add_csrc(mblk_t *mp ,uint32_t csrc);
+#define rtp_set_payload_type(mp,pt)	((rtp_header_t*)((mp)->b_rptr))->paytype=(pt)
+
+#define rtp_get_version(mp)	(((rtp_header_t*)((mp)->b_rptr))->version)
+#define rtp_get_markbit(mp)	(((rtp_header_t*)((mp)->b_rptr))->markbit)
+#define rtp_get_extbit(mp)	(((rtp_header_t*)((mp)->b_rptr))->extbit)
+#define rtp_get_timestamp(mp)	(((rtp_header_t*)((mp)->b_rptr))->timestamp)
+#define rtp_get_seqnumber(mp)	(((rtp_header_t*)((mp)->b_rptr))->seq_number)
+#define rtp_get_payload_type(mp)	(((rtp_header_t*)((mp)->b_rptr))->paytype)
+#define rtp_get_ssrc(mp)		(((rtp_header_t*)((mp)->b_rptr))->ssrc)
+#define rtp_get_cc(mp)		(((rtp_header_t*)((mp)->b_rptr))->cc)
+#define rtp_get_csrc(mp, idx)		(((rtp_header_t*)((mp)->b_rptr))->csrc[idx])
+
+ORTP_PUBLIC int rtp_get_payload(mblk_t *packet, unsigned char **start);
+ORTP_PUBLIC int rtp_get_extheader(mblk_t *packet, uint16_t *profile, uint8_t **start_ext);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpprofile.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpprofile.h"
new file mode 100755
index 0000000..16f956d
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpprofile.h"
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file rtpprofile.h
+ * \brief Using and creating standart and custom RTP profiles
+ *
+**/
+
+#ifndef RTPPROFILE_H
+#define RTPPROFILE_H
+#include <ortp/port.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+#define RTP_PROFILE_MAX_PAYLOADS 128
+
+/**
+ * The RTP profile is a table RTP_PROFILE_MAX_PAYLOADS entries to make the matching
+ * between RTP payload type number and the PayloadType that defines the type of
+ * media.
+**/
+struct _RtpProfile
+{
+	char *name;
+	PayloadType *payload[RTP_PROFILE_MAX_PAYLOADS];
+};
+
+
+typedef struct _RtpProfile RtpProfile;
+
+ORTP_VAR_PUBLIC RtpProfile av_profile;
+
+#define rtp_profile_get_name(profile) 	(const char*)((profile)->name)
+
+ORTP_PUBLIC void rtp_profile_set_payload(RtpProfile *prof, int idx, PayloadType *pt);
+
+/**
+ *	Set payload type number \a index unassigned in the profile.
+ *
+ *@param profile an RTP profile
+ *@param index	the payload type number
+**/
+#define rtp_profile_clear_payload(profile,index) \
+	rtp_profile_set_payload(profile,index,NULL)
+
+/* I prefer have this function inlined because it is very often called in the code */
+/**
+ *
+ *	Gets the payload description of the payload type \a index in the profile.
+ *
+ *@param prof an RTP profile (a #_RtpProfile object)
+ *@param idx	the payload type number
+ *@return the payload description (a PayloadType object)
+**/
+static ORTP_INLINE PayloadType * rtp_profile_get_payload(const RtpProfile *prof, int idx){
+	if (idx<0 || idx>=RTP_PROFILE_MAX_PAYLOADS) {
+		return NULL;
+	}
+	return prof->payload[idx];
+}
+ORTP_PUBLIC void rtp_profile_clear_all(RtpProfile *prof);
+ORTP_PUBLIC void rtp_profile_set_name(RtpProfile *prof, const char *name);
+ORTP_PUBLIC PayloadType * rtp_profile_get_payload_from_mime(RtpProfile *profile,const char *mime);
+ORTP_PUBLIC PayloadType * rtp_profile_get_payload_from_rtpmap(RtpProfile *profile, const char *rtpmap);
+ORTP_PUBLIC int rtp_profile_get_payload_number_from_mime(RtpProfile *profile, const char *mime);
+ORTP_PUBLIC int rtp_profile_get_payload_number_from_mime_and_flag(RtpProfile *profile, const char *mime, int flag);
+ORTP_PUBLIC int rtp_profile_get_payload_number_from_rtpmap(RtpProfile *profile, const char *rtpmap);
+ORTP_PUBLIC int rtp_profile_find_payload_number(RtpProfile *prof,const char *mime,int rate, int channels);
+ORTP_PUBLIC PayloadType * rtp_profile_find_payload(RtpProfile *prof,const char *mime,int rate, int channels);
+ORTP_PUBLIC int rtp_profile_move_payload(RtpProfile *prof,int oldpos,int newpos);
+
+ORTP_PUBLIC RtpProfile * rtp_profile_new(const char *name);
+/* clone a profile, payload are not cloned */
+ORTP_PUBLIC RtpProfile * rtp_profile_clone(RtpProfile *prof);
+
+
+/*clone a profile and its payloads (ie payload type are newly allocated, not reusing payload types of the reference profile) */
+ORTP_PUBLIC RtpProfile * rtp_profile_clone_full(RtpProfile *prof);
+/* frees the profile and all its PayloadTypes*/
+ORTP_PUBLIC void rtp_profile_destroy(RtpProfile *prof);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpsession.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpsession.h"
new file mode 100755
index 0000000..5618191
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpsession.h"
@@ -0,0 +1,785 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * \file rtpsession.h
+ * \brief The RtpSession api
+ *
+ * The RtpSession objects represent a RTP session: once it is configured with
+ * local and remote network addresses and a payload type is given, it let you send
+ * and recv a media stream.
+**/
+
+
+#ifndef RTPSESSION_H
+#define RTPSESSION_H
+
+
+#include <bctoolbox/list.h>
+
+#include <ortp/port.h>
+#include <ortp/rtp.h>
+#include <ortp/payloadtype.h>
+#include <ortp/rtpprofile.h>
+#include <ortp/sessionset.h>
+#include <ortp/rtcp.h>
+#include <ortp/str_utils.h>
+#include <ortp/utils.h>
+#include <ortp/rtpsignaltable.h>
+#include <ortp/event.h>
+
+#define ORTP_AVPF_FEATURE_NONE 0
+#define ORTP_AVPF_FEATURE_TMMBR (1 << 0)
+#define ORTP_AVPF_FEATURE_GENERIC_NACK (1 << 1)
+#define ORTP_AVPF_FEATURE_IMMEDIATE_NACK (1 << 2)
+
+
+typedef enum {
+	RTP_SESSION_RECVONLY,
+	RTP_SESSION_SENDONLY,
+	RTP_SESSION_SENDRECV
+} RtpSessionMode;
+
+
+typedef enum _OrtpJitterBufferAlgorithm {
+	OrtpJitterBufferBasic,
+	OrtpJitterBufferRecursiveLeastSquare,
+} OrtpJitterBufferAlgorithm;
+
+/*! Jitter buffer parameters
+*/
+typedef struct _JBParameters{
+	int min_size; /*(adaptive=TRUE only) maximum dynamic delay to be added to incoming packets (ms) */
+	int nom_size; /*(adaptive=TRUE only) initial dynamic delay to be added to incoming packets (ms) */
+	int max_size; /*(adaptive=TRUE only) minimum dynamic delay to be added to incoming packets (ms) */
+	bool_t adaptive; /*either a dynamic buffer should be used or not to compensate bursts */
+	bool_t enabled; /*whether jitter buffer is enabled*/
+	bool_t pad[2]; /*(dev only) alignment pad: insert your bool_t here*/
+	int max_packets; /**max number of packets allowed to be queued in the jitter buffer */
+	OrtpJitterBufferAlgorithm buffer_algorithm;
+	int refresh_ms; /* (adaptive=TRUE only) dynamic buffer size update frequency (ms) */
+	int ramp_threshold; /*(adaptive=TRUE, algo=RLS only) Percentage in [0;100] threshold between current jitter and previous jitter to enable smooth ramp*/
+	int ramp_step_ms; /*(adaptive=TRUE, algo=RLS only) In smooth ramp, how much we should reduce jitter size on each step*/
+	int ramp_refresh_ms; /*(adaptive=TRUE, algo=RLS only) In smooth ramp, frequency of step*/
+} JBParameters;
+
+typedef struct _JitterControl
+{
+	JBParameters params;
+	unsigned int count; /* number of packets handled in jitter_control_new_packet. Used internally only. */
+	int jitt_comp_ts; /* the nominal jitter buffer size converted in rtp time (same unit as timestamp) */
+	int adapt_jitt_comp_ts;
+	int32_t clock_offset_ts; /*offset difference between local and distant clock, in timestamp units*/
+	int32_t prev_clock_offset_ts;
+	int32_t olddiff;
+	float jitter;
+	float inter_jitter;	/* interarrival jitter as defined in the RFC */
+	float jitter_buffer_mean_size; /*effective size (fullness) of jitter buffer*/
+	int corrective_step;
+	int corrective_slide;
+	uint64_t cum_jitter_buffer_size; /*in timestamp units*/
+	unsigned int cum_jitter_buffer_count; /*used for computation of jitter buffer size*/
+	int clock_rate;
+	uint32_t adapt_refresh_prev_ts; /*last time we refreshed the buffer*/
+	OrtpExtremum max_ts_deviation; /*maximum difference between packet and expected timestamps */
+	OrtpKalmanRLS kalman_rls;
+	double capped_clock_ratio;
+	uint32_t last_log_ts;
+	uint32_t local_ts_start;
+	uint32_t remote_ts_start;
+	uint32_t diverged_start_ts;
+	bool_t is_diverging;
+	bool_t jb_size_updated;
+	bool_t pad[2];
+} JitterControl;
+
+typedef struct _WaitPoint
+{
+	ortp_mutex_t lock;
+	ortp_cond_t  cond;
+	uint32_t time;
+	bool_t wakeup;
+} WaitPoint;
+
+typedef struct _RtpTransportModifier
+{
+	void *data;
+	struct _RtpSession *session;//<back pointer to the owning session, set by oRTP
+	struct _RtpTransport *transport;//<back point to the owning transport, set by oRTP
+	int  (*t_process_on_send)(struct _RtpTransportModifier *t, mblk_t *msg);
+	int  (*t_process_on_receive)(struct _RtpTransportModifier *t, mblk_t *msg);
+	void  (*t_process_on_schedule)(struct _RtpTransportModifier *t); /*invoked each time rtp_session_recvm is called even is no message are available*/
+	/**
+	 * Mandatory callback responsible of freeing the #_RtpTransportModifier AND the pointer.
+	 * @param[in] transport #_RtpTransportModifier object to free.
+	 */
+	void  (*t_destroy)(struct _RtpTransportModifier *transport);
+} RtpTransportModifier;
+
+typedef struct _RtpTransport
+{
+	void *data;
+	struct _RtpSession *session;//<back pointer to the owning session, set by oRTP
+	ortp_socket_t (*t_getsocket)(struct _RtpTransport *t);
+	int  (*t_sendto)(struct _RtpTransport *t, mblk_t *msg , int flags, const struct sockaddr *to, socklen_t tolen);
+	int  (*t_recvfrom)(struct _RtpTransport *t, mblk_t *msg, int flags, struct sockaddr *from, socklen_t *fromlen);
+	void  (*t_close)(struct _RtpTransport *transport);
+	/**
+	 * Mandatory callback responsible of freeing the #_RtpTransport object AND the pointer.
+	 * @param[in] transport #_RtpTransport object to free.
+	 */
+	void  (*t_destroy)(struct _RtpTransport *transport);
+}  RtpTransport;
+
+typedef enum _OrtpNetworkSimulatorMode{
+	OrtpNetworkSimulatorInvalid=-1,
+	OrtpNetworkSimulatorInbound,/**<simulation is applied when receiving packets*/
+	OrtpNetworkSimulatorOutbound, /**<simulation is applied to sent packets*/
+	OrtpNetworkSimulatorOutboundControlled /**<simulation is applied to sent packets according to sent timestamps
+				set in the timestamps field of mblk_t, which is defined only with -DORTP_TIMESTAMP */
+}OrtpNetworkSimulatorMode;
+
+/**
+ * Structure describing the network simulator parameters
+**/
+typedef struct _OrtpNetworkSimulatorParams{
+	int enabled; /**<Whether simulation is enabled or off.*/
+	float max_bandwidth; /**<IP bandwidth, in bit/s.
+						This limitation is applied after loss are simulated, so incoming bandwidth
+						is NOT socket bandwidth, but after-loss-simulation bandwidth e.g with 50% loss, the bandwidth will be 50% reduced*/
+	int max_buffer_size; /**<Max number of bit buffered before being discarded*/
+	float loss_rate; /**<Percentage of lost packets*/
+	uint32_t latency; /**<Packet transmission delay, in ms*/
+	float consecutive_loss_probability;/**< a probability of having a subsequent loss after a loss occurred, in a 0-1 range. Useful to simulate burst of lost packets*/
+	float jitter_burst_density; /**<density of gap/bursts events. A value of 1 means one gap/burst per second approximately*/
+	float jitter_strength; /**<percentage of max_bandwidth artificially consumed during bursts events*/
+	bool_t rtp_only; /**True for only RTP packet loss, False for both RTP and RTCP */
+	bool_t pad[3];
+	OrtpNetworkSimulatorMode mode; /**<whether simulation is applied to inbound or outbound stream.*/
+}OrtpNetworkSimulatorParams;
+
+typedef struct _OrtpNetworkSimulatorCtx{
+	OrtpNetworkSimulatorParams params;
+	int bit_budget;
+	int qsize;
+	queue_t q;/*queue used for simulating bandwidth limit*/
+	queue_t latency_q;
+	queue_t send_q; /*used only for OrtpNetworkSimulatorOutbound direction*/
+	struct timeval last_check;
+	uint64_t last_jitter_event;
+	int consecutive_drops;
+	int drops_to_ignore;
+	int drop_by_congestion;
+	int drop_by_loss;
+	int total_count; /*total number of packets gone through the simulator*/
+	ortp_mutex_t mutex;
+	ortp_thread_t thread;
+	bool_t in_jitter_event;
+	bool_t thread_started;
+}OrtpNetworkSimulatorCtx;
+
+typedef struct OrtpRtcpSendAlgorithm {
+	uint64_t tn; /* Time of the next scheduled RTCP RR transmission in milliseconds. */
+	uint64_t tp; /* Time of the last scheduled RTCP RR transmission in milliseconds. */
+	uint64_t t_rr_last; /* Time of the last regular RTCP packet sent in milliseconds. */
+	uint32_t T_rr; /* Interval for the scheduling of the next regular RTCP packet. */
+	uint32_t T_max_fb_delay; /* Interval within which a feeback message is considered to be useful to the sender. */
+	uint32_t T_rr_interval; /* Minimal interval to be used between regular RTCP packets. */
+	uint32_t T_rr_current_interval;
+	uint32_t Tmin; /* Minimal interval between RTCP packets. */
+	float avg_rtcp_size;
+	mblk_t *fb_packets;
+	bool_t initialized; /* Whether the RTCP send algorithm is fully initialized. */
+	bool_t initial;
+	bool_t allow_early;
+	bool_t tmmbr_scheduled;
+	bool_t tmmbn_scheduled;
+} OrtpRtcpSendAlgorithm;
+
+typedef struct OrtpRtcpFbConfiguration {
+	bool_t generic_nack_enabled;
+	bool_t tmmbr_enabled;
+} OrtpRtcpFbConfiguration;
+
+#define ORTP_RTCP_XR_UNAVAILABLE_PARAMETER 127
+
+typedef enum {
+	OrtpRtcpXrNoPlc,
+	OrtpRtcpXrSilencePlc,
+	OrtpRtcpXrEnhancedPlc
+} OrtpRtcpXrPlcStatus;
+
+typedef OrtpRtcpXrPlcStatus (*OrtpRtcpXrPlcCallback)(void *userdata);
+typedef int (*OrtpRtcpXrSignalLevelCallback)(void *userdata);
+typedef int (*OrtpRtcpXrNoiseLevelCallback)(void *userdata);
+typedef float (*OrtpRtcpXrAverageQualityIndicatorCallback)(void *userdata);
+
+typedef struct OrtpRtcpXrMediaCallbacks {
+	OrtpRtcpXrPlcCallback plc;
+	OrtpRtcpXrSignalLevelCallback signal_level;
+	OrtpRtcpXrNoiseLevelCallback noise_level;
+	OrtpRtcpXrAverageQualityIndicatorCallback average_qi;
+	OrtpRtcpXrAverageQualityIndicatorCallback average_lq_qi;
+	void *userdata;
+} OrtpRtcpXrMediaCallbacks;
+
+typedef enum {
+	OrtpRtcpXrRcvrRttNone,
+	OrtpRtcpXrRcvrRttAll,
+	OrtpRtcpXrRcvrRttSender
+} OrtpRtcpXrRcvrRttMode;
+
+typedef enum {
+	OrtpRtcpXrStatSummaryNone = 0,
+	OrtpRtcpXrStatSummaryLoss = (1 << 7),
+	OrtpRtcpXrStatSummaryDup = (1 << 6),
+	OrtpRtcpXrStatSummaryJitt = (1 << 5),
+	OrtpRtcpXrStatSummaryTTL = (1 << 3),
+	OrtpRtcpXrStatSummaryHL = (1 << 4)
+} OrtpRtcpXrStatSummaryFlag;
+
+typedef struct OrtpRtcpXrConfiguration {
+	bool_t enabled;
+	bool_t stat_summary_enabled;
+	bool_t voip_metrics_enabled;
+	bool_t pad;
+	OrtpRtcpXrRcvrRttMode rcvr_rtt_mode;
+	int rcvr_rtt_max_size;
+	OrtpRtcpXrStatSummaryFlag stat_summary_flags;
+} OrtpRtcpXrConfiguration;
+
+typedef struct OrtpRtcpXrStats {
+	uint32_t last_rcvr_rtt_ts;	/* NTP timestamp (middle 32 bits) of last received XR rcvr-rtt */
+	struct timeval last_rcvr_rtt_time;	/* Time at which last XR rcvr-rtt was received  */
+	uint16_t rcv_seq_at_last_stat_summary;	/* Received sequence number at last XR stat-summary sent */
+	uint32_t rcv_since_last_stat_summary;	/* The number of packets received since last XR stat-summary was sent */
+	uint32_t dup_since_last_stat_summary;	/* The number of duplicate packets received since last XR stat-summary was sent */
+	uint32_t min_jitter_since_last_stat_summary;	/* The minimum value of jitter since last XR stat-summary was sent */
+	uint32_t max_jitter_since_last_stat_summary;	/* The maximum value of jitter since last XR stat-summary was sent */
+	double olds_jitter_since_last_stat_summary;
+	double oldm_jitter_since_last_stat_summary;
+	double news_jitter_since_last_stat_summary;
+	double newm_jitter_since_last_stat_summary;
+	int64_t last_jitter_diff_since_last_stat_summary;
+	double olds_ttl_or_hl_since_last_stat_summary;
+	double oldm_ttl_or_hl_since_last_stat_summary;
+	double news_ttl_or_hl_since_last_stat_summary;
+	double newm_ttl_or_hl_since_last_stat_summary;
+	uint8_t min_ttl_or_hl_since_last_stat_summary;	/* The minimum value of TTL/HL since last XR stat-summary was sent */
+	uint8_t max_ttl_or_hl_since_last_stat_summary;	/* The maximum value of TTL/HL since last XR stat-summary was sent */
+	uint32_t first_rcv_seq;
+	uint32_t last_rcv_seq;
+	uint32_t rcv_count;
+	uint32_t discarded_count;
+} OrtpRtcpXrStats;
+
+typedef struct OrtpRtcpTmmbrInfo {
+	mblk_t *sent;
+	mblk_t *received;
+} OrtpRtcpTmmbrInfo;
+
+typedef struct _OrtpAddress{
+	struct sockaddr_storage addr;
+	socklen_t len;
+}OrtpAddress;
+
+typedef struct _OrtpStream {
+	ortp_socket_t socket;
+	int sockfamily;
+	int loc_port;
+	socklen_t rem_addrlen;
+	struct sockaddr_storage rem_addr;
+	socklen_t loc_addrlen;
+	struct sockaddr_storage loc_addr;
+	struct _RtpTransport *tr;
+	OrtpBwEstimator recv_bw_estimator;
+	struct timeval send_bw_start; /* used for bandwidth estimation */
+	struct timeval recv_bw_start; /* used for bandwidth estimation */
+	unsigned int sent_bytes; /* used for bandwidth estimation */
+	unsigned int recv_bytes; /* used for bandwidth estimation */
+	float upload_bw;
+	float download_bw;
+	float average_upload_bw;
+	float average_download_bw;
+	bctbx_list_t *aux_destinations; /*list of OrtpAddress */
+	msgb_allocator_t allocator;
+} OrtpStream;
+
+typedef struct _RtpStream
+{
+	OrtpStream gs;
+	int time_jump;
+	uint32_t ts_jump;
+	queue_t rq;
+	queue_t tev_rq;
+	void *QoSHandle;
+	unsigned long QoSFlowID;
+	JitterControl jittctl;
+	uint32_t snd_time_offset;/*the scheduler time when the application send its first timestamp*/
+	uint32_t snd_ts_offset;	/* the first application timestamp sent by the application */
+	uint32_t snd_rand_offset;	/* a random number added to the user offset to make the stream timestamp*/
+	uint32_t snd_last_ts;	/* the last stream timestamp sent */
+	uint16_t snd_last_nack;	/* the last nack sent when in immediate mode */
+	uint32_t rcv_time_offset; /*the scheduler time when the application ask for its first timestamp*/
+	uint32_t rcv_ts_offset;  /* the first stream timestamp */
+	uint32_t rcv_query_ts_offset;	/* the first user timestamp asked by the application */
+	uint32_t rcv_last_ts;	/* the last stream timestamp got by the application */
+	uint16_t rcv_last_seq;	/* the last stream sequence number got by the application*/
+	uint16_t pad;
+	uint32_t rcv_last_app_ts; /* the last application timestamp asked by the application */
+	uint32_t rcv_last_ret_ts; /* the timestamp of the last sample returned (only for continuous audio)*/
+	uint32_t hwrcv_extseq; /* last received on socket extended sequence number */
+	uint32_t hwrcv_seq_at_last_SR;
+	uint32_t hwrcv_since_last_SR;
+	uint32_t last_rcv_SR_ts;     /* NTP timestamp (middle 32 bits) of last received SR */
+	struct timeval last_rcv_SR_time;   /* time at which last SR was received  */
+	uint16_t snd_seq; /* send sequence number */
+	uint32_t last_rtcp_packet_count; /*the sender's octet count in the last sent RTCP SR*/
+	uint32_t sent_payload_bytes; /*used for RTCP sender reports*/
+	int recv_errno;
+	int send_errno;
+	int snd_socket_size;
+	int rcv_socket_size;
+	int ssrc_changed_thres;
+	jitter_stats_t jitter_stats;
+	struct _OrtpCongestionDetector *congdetect;
+	struct _OrtpVideoBandwidthEstimator *video_bw_estimator;
+	ortp_thread_t win_t;
+	volatile bool_t is_win_thread_running;
+	ortp_mutex_t winthread_lock;
+	queue_t winrq;
+	ortp_mutex_t winrq_lock;
+}RtpStream;
+
+typedef struct _RtcpStream
+{
+	OrtpStream gs;
+	OrtpRtcpSendAlgorithm send_algo;
+	OrtpRtcpXrConfiguration xr_conf;
+	OrtpRtcpXrMediaCallbacks xr_media_callbacks;
+	OrtpRtcpTmmbrInfo tmmbr_info;
+	bool_t enabled; /*tells whether we can send RTCP packets */
+	bool_t rtcp_xr_dlrr_to_send;
+	uint8_t rtcp_fb_fir_seq_nr;	/* The FIR command sequence number */
+	uint32_t last_rtcp_fb_pli_snt;
+} RtcpStream;
+
+typedef struct _RtpSession RtpSession;
+
+
+/**
+ * An object representing a bi-directional RTP session.
+ * It holds sockets, jitter buffer, various counters (timestamp, sequence numbers...)
+ * Applications SHOULD NOT try to read things within the RtpSession object but use
+ * instead its public API (the rtp_session_* methods) where RtpSession is used as a
+ * pointer.
+ * rtp_session_new() allocates and initialize a RtpSession.
+**/
+struct _RtpSession
+{
+	RtpSession *next;	/* next RtpSession, when the session are enqueued by the scheduler */
+	int mask_pos;	/* the position in the scheduler mask of RtpSession : do not move this field: it is part of the ABI since the session_set macros use it*/
+	struct {
+		RtpProfile *profile;
+		int pt;
+		unsigned int ssrc;
+		WaitPoint wp;
+	} snd,rcv;
+	unsigned int inc_ssrc_candidate;
+	int inc_same_ssrc_count;
+	int hw_recv_pt; /* recv payload type before jitter buffer */
+	int recv_buf_size;
+	int target_upload_bandwidth; /* Target upload bandwidth at network layer (with IP and UDP headers) in bits/s */
+	RtpSignalTable on_ssrc_changed;
+	RtpSignalTable on_payload_type_changed;
+	RtpSignalTable on_telephone_event_packet;
+	RtpSignalTable on_telephone_event;
+	RtpSignalTable on_timestamp_jump;
+	RtpSignalTable on_network_error;
+	RtpSignalTable on_rtcp_bye;
+	bctbx_list_t *signal_tables;
+	bctbx_list_t *eventqs;
+	RtpStream rtp;
+	RtcpStream rtcp;
+	OrtpRtcpXrStats rtcp_xr_stats;
+	RtpSessionMode mode;
+	struct _RtpScheduler *sched;
+	uint32_t flags;
+	int dscp;
+	int multicast_ttl;
+	int multicast_loopback;
+	float duplication_ratio; /* Number of times a packet should be duplicated */
+	float duplication_left ; /* Remainder of the duplication ratio, internal use */
+	void * user_data;
+	/* FIXME: Should be a table for all session participants. */
+	struct timeval last_recv_time; /* Time of receiving the RTP/RTCP packet. */
+	mblk_t *pending;
+	/* telephony events extension */
+	int tev_send_pt; /*telephone event to be used for sending*/
+	mblk_t *current_tev;		/* the pending telephony events */
+	mblk_t *minimal_sdes;
+	mblk_t *full_sdes;
+	queue_t contributing_sources;
+	int lost_packets_test_vector;
+	unsigned int interarrival_jitter_test_vector;
+	unsigned int delay_test_vector;
+	float rtt;/*last round trip delay calculated*/
+	int cum_loss;
+	OrtpNetworkSimulatorCtx *net_sim_ctx;
+	RtpSession *spliced_session; /*a RtpSession that will retransmit everything received on this session*/
+	rtp_stats_t stats;
+	bctbx_list_t *recv_addr_map;
+	uint32_t send_ts_offset; /*additional offset to add when sending packets */
+	bool_t symmetric_rtp;
+	bool_t permissive; /*use the permissive algorithm*/
+	bool_t use_connect; /* use connect() on the socket */
+	bool_t ssrc_set;
+
+	bool_t reuseaddr; /*setsockopt SO_REUSEADDR */
+	bool_t rtcp_mux;
+	unsigned char avpf_features; /**< A bitmask of ORTP_AVPF_FEATURE_* macros. */
+	bool_t use_pktinfo;
+
+	bool_t is_spliced;
+	bool_t congestion_detector_enabled;
+	bool_t video_bandwidth_estimator_enabled;
+};
+
+/**
+ * Structure describing the video bandwidth estimator parameters
+**/
+typedef struct _OrtpVideoBandwidthEstimatorParams {
+	int enabled; /**<Whether estimator is enabled or off.*/
+	unsigned int packet_count_min; /** minimum number of packets with the same sent timestamp to be processed continuously before being used */
+	unsigned int packets_size_max; /** number of packets needed to compute the available video bandwidth */
+	unsigned int trust_percentage; /** percentage for which the chosen bandwidth value in all available will be inferior */
+} OrtpVideoBandwidthEstimatorParams;
+
+
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+ORTP_PUBLIC const char *ortp_network_simulator_mode_to_string(OrtpNetworkSimulatorMode mode);
+ORTP_PUBLIC OrtpNetworkSimulatorMode ortp_network_simulator_mode_from_string(const char *str);
+
+
+/* public API */
+ORTP_PUBLIC RtpSession *rtp_session_new(int mode);
+ORTP_PUBLIC void rtp_session_set_scheduling_mode(RtpSession *session, int yesno);
+ORTP_PUBLIC void rtp_session_set_blocking_mode(RtpSession *session, int yesno);
+ORTP_PUBLIC void rtp_session_set_profile(RtpSession *session, RtpProfile *profile);
+ORTP_PUBLIC void rtp_session_set_send_profile(RtpSession *session,RtpProfile *profile);
+ORTP_PUBLIC void rtp_session_set_recv_profile(RtpSession *session,RtpProfile *profile);
+ORTP_PUBLIC RtpProfile *rtp_session_get_profile(RtpSession *session);
+ORTP_PUBLIC RtpProfile *rtp_session_get_send_profile(RtpSession *session);
+ORTP_PUBLIC RtpProfile *rtp_session_get_recv_profile(RtpSession *session);
+ORTP_PUBLIC int rtp_session_signal_connect(RtpSession *session,const char *signal_name, RtpCallback cb, void *user_data);
+ORTP_PUBLIC int rtp_session_signal_disconnect_by_callback(RtpSession *session,const char *signal_name, RtpCallback cb);
+ORTP_PUBLIC void rtp_session_set_ssrc(RtpSession *session, uint32_t ssrc);
+ORTP_PUBLIC uint32_t rtp_session_get_send_ssrc(RtpSession* session);
+ORTP_PUBLIC uint32_t rtp_session_get_recv_ssrc(RtpSession *session);
+ORTP_PUBLIC void rtp_session_set_seq_number(RtpSession *session, uint16_t seq);
+ORTP_PUBLIC uint16_t rtp_session_get_seq_number(RtpSession *session);
+ORTP_PUBLIC uint32_t rtp_session_get_rcv_ext_seq_number(RtpSession *session);
+ORTP_PUBLIC int rtp_session_get_cum_loss(RtpSession *session);
+ORTP_PUBLIC void rtp_session_set_duplication_ratio(RtpSession *session, float ratio);
+
+ORTP_PUBLIC void rtp_session_enable_jitter_buffer(RtpSession *session , bool_t enabled);
+ORTP_PUBLIC bool_t rtp_session_jitter_buffer_enabled(const RtpSession *session);
+ORTP_PUBLIC void rtp_session_set_jitter_buffer_params(RtpSession *session, const JBParameters *par);
+ORTP_PUBLIC void rtp_session_get_jitter_buffer_params(RtpSession *session, JBParameters *par);
+
+/**
+ * Set an additional timestamps offset for outgoing stream..
+ * @param s		a rtp session freshly created.
+ * @param offset		a timestamp offset value
+ *
+**/
+ORTP_PUBLIC void rtp_session_set_send_ts_offset(RtpSession *s, uint32_t offset);
+ORTP_PUBLIC uint32_t rtp_session_get_send_ts_offset(RtpSession *s);
+
+
+/*deprecated jitter control functions*/
+ORTP_PUBLIC void rtp_session_set_jitter_compensation(RtpSession *session, int milisec);
+ORTP_PUBLIC void rtp_session_enable_adaptive_jitter_compensation(RtpSession *session, bool_t val);
+ORTP_PUBLIC bool_t rtp_session_adaptive_jitter_compensation_enabled(RtpSession *session);
+
+ORTP_PUBLIC void rtp_session_set_time_jump_limit(RtpSession *session, int miliseconds);
+ORTP_PUBLIC int rtp_session_join_multicast_group(RtpSession *session, const char *ip);
+ORTP_PUBLIC int rtp_session_set_local_addr(RtpSession *session,const char *addr, int rtp_port, int rtcp_port);
+ORTP_PUBLIC int rtp_session_get_local_port(const RtpSession *session);
+ORTP_PUBLIC int rtp_session_get_local_rtcp_port(const RtpSession *session);
+
+ORTP_PUBLIC int
+rtp_session_set_remote_addr_full (RtpSession * session, const char * rtp_addr, int rtp_port, const char * rtcp_addr, int rtcp_port);
+/*same as previous function, old name:*/
+ORTP_PUBLIC int rtp_session_set_remote_addr_and_port (RtpSession * session, const char * addr, int rtp_port, int rtcp_port);
+ORTP_PUBLIC int rtp_session_set_remote_addr(RtpSession *session,const char *addr, int port);
+ORTP_PUBLIC int rtp_session_add_aux_remote_addr_full(RtpSession * session, const char * rtp_addr, int rtp_port, const char * rtcp_addr, int rtcp_port);
+ORTP_PUBLIC void rtp_session_clear_aux_remote_addr(RtpSession * session);
+/* alternatively to the set_remote_addr() and set_local_addr(), an application can give
+a valid socket (potentially connect()ed )to be used by the RtpSession */
+ORTP_PUBLIC void rtp_session_set_sockets(RtpSession *session, int rtpfd, int rtcpfd);
+
+ORTP_PUBLIC void rtp_session_get_transports(const RtpSession *session, RtpTransport **rtptr, RtpTransport **rtcptr);
+/*those methods are provided for people who wants to send non-RTP messages using the RTP/RTCP sockets */
+ORTP_PUBLIC ortp_socket_t rtp_session_get_rtp_socket(const RtpSession *session);
+ORTP_PUBLIC ortp_socket_t rtp_session_get_rtcp_socket(const RtpSession *session);
+ORTP_PUBLIC void rtp_session_refresh_sockets(RtpSession *session);
+
+
+/* QOS / DSCP */
+ORTP_PUBLIC int rtp_session_set_dscp(RtpSession *session, int dscp);
+ORTP_PUBLIC int rtp_session_get_dscp(const RtpSession *session);
+
+
+/* Packet info */
+ORTP_PUBLIC int rtp_session_set_pktinfo(RtpSession *session, int activate);
+
+/* Multicast methods */
+ORTP_PUBLIC int rtp_session_set_multicast_ttl(RtpSession *session, int ttl);
+ORTP_PUBLIC int rtp_session_get_multicast_ttl(RtpSession *session);
+
+ORTP_PUBLIC int rtp_session_set_multicast_loopback(RtpSession *session, int yesno);
+ORTP_PUBLIC int rtp_session_get_multicast_loopback(RtpSession *session);
+
+
+
+ORTP_PUBLIC int rtp_session_set_send_payload_type(RtpSession *session, int paytype);
+ORTP_PUBLIC int rtp_session_get_send_payload_type(const RtpSession *session);
+
+ORTP_PUBLIC int rtp_session_get_recv_payload_type(const RtpSession *session);
+ORTP_PUBLIC int rtp_session_set_recv_payload_type(RtpSession *session, int pt);
+
+ORTP_PUBLIC int rtp_session_set_send_telephone_event_payload_type(RtpSession *session, int paytype);
+
+ORTP_PUBLIC int rtp_session_set_payload_type(RtpSession *session, int pt);
+
+ORTP_PUBLIC void rtp_session_set_symmetric_rtp (RtpSession * session, bool_t yesno);
+
+ORTP_PUBLIC bool_t rtp_session_get_symmetric_rtp (const RtpSession * session);
+
+ORTP_PUBLIC void rtp_session_enable_rtcp_mux(RtpSession *session, bool_t yesno);
+
+ORTP_PUBLIC bool_t rtp_session_rtcp_mux_enabled(RtpSession *session);
+
+ORTP_PUBLIC void rtp_session_set_connected_mode(RtpSession *session, bool_t yesno);
+
+ORTP_PUBLIC void rtp_session_enable_rtcp(RtpSession *session, bool_t yesno);
+/*
+ * rtcp status
+ * @return TRUE if rtcp is enabled for this session
+ */
+ORTP_PUBLIC bool_t rtp_session_rtcp_enabled(const RtpSession *session);
+
+ORTP_PUBLIC void rtp_session_set_rtcp_report_interval(RtpSession *session, int value_ms);
+
+/**
+ * Define the bandwidth available for RTCP streams based on the upload bandwidth
+ * targeted by the application (in bits/s). RTCP streams would not take more than
+ * a few percents of the limit bandwidth (around 5%).
+ *
+ * @param session a rtp session
+ * @param target_bandwidth bandwidth limit in bits/s
+ */
+ORTP_PUBLIC void rtp_session_set_target_upload_bandwidth(RtpSession *session, int target_bandwidth);
+ORTP_PUBLIC int rtp_session_get_target_upload_bandwidth(RtpSession *session);
+
+ORTP_PUBLIC void rtp_session_configure_rtcp_xr(RtpSession *session, const OrtpRtcpXrConfiguration *config);
+ORTP_PUBLIC void rtp_session_set_rtcp_xr_media_callbacks(RtpSession *session, const OrtpRtcpXrMediaCallbacks *cbs);
+
+ORTP_PUBLIC void rtp_session_set_ssrc_changed_threshold(RtpSession *session, int numpackets);
+
+/*low level recv and send functions */
+ORTP_PUBLIC mblk_t * rtp_session_recvm_with_ts (RtpSession * session, uint32_t user_ts);
+ORTP_PUBLIC mblk_t * rtp_session_create_packet(RtpSession *session, size_t header_size, const uint8_t *payload, size_t payload_size);
+ORTP_PUBLIC mblk_t * rtp_session_create_packet_raw(const uint8_t *packet, size_t packet_size);
+ORTP_PUBLIC mblk_t * rtp_session_create_packet_with_data(RtpSession *session, uint8_t *payload, size_t payload_size, void (*freefn)(void*));
+ORTP_PUBLIC mblk_t * rtp_session_create_packet_in_place(RtpSession *session,uint8_t *buffer, size_t size, void (*freefn)(void*) );
+ORTP_PUBLIC int rtp_session_sendm_with_ts (RtpSession * session, mblk_t *mp, uint32_t userts);
+ORTP_PUBLIC int rtp_session_sendto(RtpSession *session, bool_t is_rtp, mblk_t *m, int flags, const struct sockaddr *destaddr, socklen_t destlen);
+ORTP_PUBLIC int rtp_session_recvfrom(RtpSession *session, bool_t is_rtp, mblk_t *m, int flags, struct sockaddr *from, socklen_t *fromlen);
+/* high level recv and send functions */
+ORTP_PUBLIC int rtp_session_recv_with_ts(RtpSession *session, uint8_t *buffer, int len, uint32_t ts, int *have_more);
+ORTP_PUBLIC int rtp_session_send_with_ts(RtpSession *session, const uint8_t *buffer, int len, uint32_t userts);
+
+/* Specific function called to reset the winrq queue and if called on windows to stop the async reception thread */
+ORTP_PUBLIC void rtp_session_reset_recvfrom(RtpSession *session);
+
+/* event API*/
+ORTP_PUBLIC void rtp_session_register_event_queue(RtpSession *session, OrtpEvQueue *q);
+ORTP_PUBLIC void rtp_session_unregister_event_queue(RtpSession *session, OrtpEvQueue *q);
+
+
+/* IP bandwidth usage estimation functions, returning bits/s*/
+ORTP_PUBLIC float rtp_session_compute_send_bandwidth(RtpSession *session);
+ORTP_PUBLIC float rtp_session_compute_recv_bandwidth(RtpSession *session);
+ORTP_PUBLIC float rtp_session_get_send_bandwidth(RtpSession *session);
+ORTP_PUBLIC float rtp_session_get_recv_bandwidth(RtpSession *session);
+ORTP_PUBLIC float rtp_session_get_rtp_send_bandwidth(RtpSession *session);
+ORTP_PUBLIC float rtp_session_get_rtp_recv_bandwidth(RtpSession *session);
+ORTP_PUBLIC float rtp_session_get_rtcp_send_bandwidth(RtpSession *session);
+ORTP_PUBLIC float rtp_session_get_rtcp_recv_bandwidth(RtpSession *session);
+
+ORTP_PUBLIC float rtp_session_get_send_bandwidth_smooth(RtpSession *session);
+ORTP_PUBLIC float rtp_session_get_recv_bandwidth_smooth(RtpSession *session);
+
+ORTP_PUBLIC void rtp_session_send_rtcp_APP(RtpSession *session, uint8_t subtype, const char *name, const uint8_t *data, int datalen);
+/**
+ *	Send the rtcp datagram \a packet to the destination set by rtp_session_set_remote_addr()
+ *  The packet (\a packet) is freed once it is sent.
+ *
+ * @param session a rtp session.
+ * @param m a rtcp packet presented as a mblk_t.
+ * @return the number of bytes sent over the network.
+ **/
+
+ORTP_PUBLIC	int rtp_session_rtcp_sendm_raw(RtpSession * session, mblk_t * m);
+
+
+ORTP_PUBLIC uint32_t rtp_session_get_current_send_ts(RtpSession *session);
+ORTP_PUBLIC uint32_t rtp_session_get_current_recv_ts(RtpSession *session);
+ORTP_PUBLIC void rtp_session_flush_sockets(RtpSession *session);
+ORTP_PUBLIC void rtp_session_release_sockets(RtpSession *session);
+ORTP_PUBLIC void rtp_session_resync(RtpSession *session);
+ORTP_PUBLIC void rtp_session_reset(RtpSession *session);
+ORTP_PUBLIC void rtp_session_destroy(RtpSession *session);
+
+ORTP_PUBLIC const rtp_stats_t * rtp_session_get_stats(const RtpSession *session);
+ORTP_PUBLIC const jitter_stats_t * rtp_session_get_jitter_stats( const RtpSession *session );
+ORTP_PUBLIC void rtp_session_reset_stats(RtpSession *session);
+
+ORTP_PUBLIC void rtp_session_set_data(RtpSession *session, void *data);
+ORTP_PUBLIC void *rtp_session_get_data(const RtpSession *session);
+
+ORTP_PUBLIC void rtp_session_set_recv_buf_size(RtpSession *session, int bufsize);
+ORTP_PUBLIC void rtp_session_set_rtp_socket_send_buffer_size(RtpSession * session, unsigned int size);
+ORTP_PUBLIC void rtp_session_set_rtp_socket_recv_buffer_size(RtpSession * session, unsigned int size);
+
+/* in use with the scheduler to convert a timestamp in scheduler time unit (ms) */
+ORTP_PUBLIC uint32_t rtp_session_ts_to_time(RtpSession *session,uint32_t timestamp);
+ORTP_PUBLIC uint32_t rtp_session_time_to_ts(RtpSession *session, int millisecs);
+/* this function aims at simulating senders with "imprecise" clocks, resulting in
+rtp packets sent with timestamp uncorrelated with the system clock .
+This is only availlable to sessions working with the oRTP scheduler */
+ORTP_PUBLIC void rtp_session_make_time_distorsion(RtpSession *session, int milisec);
+
+/*RTCP functions */
+ORTP_PUBLIC void rtp_session_set_source_description(RtpSession *session, const char *cname,
+	const char *name, const char *email, const char *phone,
+    const char *loc, const char *tool, const char *note);
+ORTP_PUBLIC void rtp_session_add_contributing_source(RtpSession *session, uint32_t csrc,
+    const char *cname, const char *name, const char *email, const char *phone,
+    const char *loc, const char *tool, const char *note);
+/* DEPRECATED: Use rtp_session_remove_contributing_source instead of rtp_session_remove_contributing_sources */
+#define rtp_session_remove_contributing_sources rtp_session_remove_contributing_source
+ORTP_PUBLIC void rtp_session_remove_contributing_source(RtpSession *session, uint32_t csrc);
+ORTP_PUBLIC mblk_t* rtp_session_create_rtcp_sdes_packet(RtpSession *session, bool_t full);
+
+ORTP_PUBLIC void rtp_session_get_last_recv_time(RtpSession *session, struct timeval *tv);
+ORTP_PUBLIC int rtp_session_bye(RtpSession *session, const char *reason);
+
+ORTP_PUBLIC int rtp_session_get_last_send_error_code(RtpSession *session);
+ORTP_PUBLIC void rtp_session_clear_send_error_code(RtpSession *session);
+ORTP_PUBLIC int rtp_session_get_last_recv_error_code(RtpSession *session);
+ORTP_PUBLIC void rtp_session_clear_recv_error_code(RtpSession *session);
+
+
+ORTP_PUBLIC float rtp_session_get_round_trip_propagation(RtpSession *session);
+
+
+ORTP_PUBLIC void rtp_session_enable_network_simulation(RtpSession *session, const OrtpNetworkSimulatorParams *params);
+ORTP_PUBLIC void rtp_session_enable_congestion_detection(RtpSession *session, bool_t enabled);
+ORTP_PUBLIC void rtp_session_enable_video_bandwidth_estimator(RtpSession *session, const OrtpVideoBandwidthEstimatorParams *params);
+
+ORTP_PUBLIC void rtp_session_rtcp_set_lost_packet_value( RtpSession *session, const int value );
+ORTP_PUBLIC void rtp_session_rtcp_set_jitter_value(RtpSession *session, const unsigned int value );
+ORTP_PUBLIC void rtp_session_rtcp_set_delay_value(RtpSession *session, const unsigned int value );
+ORTP_PUBLIC mblk_t * rtp_session_pick_with_cseq (RtpSession * session, const uint16_t sequence_number);
+
+
+ORTP_PUBLIC void rtp_session_send_rtcp_xr_rcvr_rtt(RtpSession *session);
+ORTP_PUBLIC void rtp_session_send_rtcp_xr_dlrr(RtpSession *session);
+ORTP_PUBLIC void rtp_session_send_rtcp_xr_stat_summary(RtpSession *session);
+ORTP_PUBLIC void rtp_session_send_rtcp_xr_voip_metrics(RtpSession *session);
+
+
+ORTP_PUBLIC bool_t rtp_session_avpf_enabled(RtpSession *session);
+ORTP_PUBLIC bool_t rtp_session_avpf_payload_type_feature_enabled(RtpSession *session, unsigned char feature);
+ORTP_PUBLIC bool_t rtp_session_avpf_feature_enabled(RtpSession *session, unsigned char feature);
+ORTP_PUBLIC void rtp_session_enable_avpf_feature(RtpSession *session, unsigned char feature, bool_t enable);
+ORTP_PUBLIC uint16_t rtp_session_get_avpf_rr_interval(RtpSession *session);
+ORTP_PUBLIC bool_t rtp_session_rtcp_psfb_scheduled(RtpSession *session, rtcp_psfb_type_t type);
+ORTP_PUBLIC bool_t rtp_session_rtcp_rtpfb_scheduled(RtpSession *session, rtcp_rtpfb_type_t type);
+ORTP_PUBLIC void rtp_session_send_rtcp_fb_generic_nack(RtpSession *session, uint16_t pid, uint16_t blp);
+ORTP_PUBLIC void rtp_session_send_rtcp_fb_pli(RtpSession *session);
+ORTP_PUBLIC void rtp_session_send_rtcp_fb_fir(RtpSession *session);
+ORTP_PUBLIC void rtp_session_send_rtcp_fb_sli(RtpSession *session, uint16_t first, uint16_t number, uint8_t picture_id);
+ORTP_PUBLIC void rtp_session_send_rtcp_fb_rpsi(RtpSession *session, uint8_t *bit_string, uint16_t bit_string_len);
+ORTP_PUBLIC void rtp_session_send_rtcp_fb_tmmbr(RtpSession *session, uint64_t mxtbr);
+ORTP_PUBLIC void rtp_session_send_rtcp_fb_tmmbn(RtpSession *session, uint32_t ssrc);
+
+
+/*private */
+ORTP_PUBLIC void rtp_session_init(RtpSession *session, int mode);
+#define rtp_session_set_flag(session,flag) (session)->flags|=(flag)
+#define rtp_session_unset_flag(session,flag) (session)->flags&=~(flag)
+ORTP_PUBLIC void rtp_session_uninit(RtpSession *session);
+ORTP_PUBLIC void rtp_session_dispatch_event(RtpSession *session, OrtpEvent *ev);
+
+
+ORTP_PUBLIC void rtp_session_set_reuseaddr(RtpSession *session, bool_t yes);
+
+ORTP_PUBLIC int meta_rtp_transport_modifier_inject_packet_to_send(RtpTransport *t, RtpTransportModifier *tpm, mblk_t *msg, int flags);
+ORTP_PUBLIC int meta_rtp_transport_modifier_inject_packet_to_send_to(RtpTransport *t, RtpTransportModifier *tpm, mblk_t *msg, int flags, const struct sockaddr *to, socklen_t tolen);
+ORTP_PUBLIC int meta_rtp_transport_modifier_inject_packet_to_recv(RtpTransport *t, RtpTransportModifier *tpm, mblk_t *msg, int flags);
+
+/**
+ * get endpoint if any
+ * @param[in] transport RtpTransport object.
+ * @return #_RtpTransport
+ *
+ * */
+ORTP_PUBLIC RtpTransport* meta_rtp_transport_get_endpoint(const RtpTransport *transport);
+/**
+ * set endpoint
+ * @param[in] transport RtpTransport object.
+ * @param[in] endpoint RtpEndpoint.
+ *
+ * */
+ORTP_PUBLIC void meta_rtp_transport_set_endpoint(RtpTransport *transport,RtpTransport *endpoint);
+
+ORTP_PUBLIC void meta_rtp_transport_destroy(RtpTransport *tp);
+ORTP_PUBLIC void meta_rtp_transport_append_modifier(RtpTransport *tp,RtpTransportModifier *tpm);
+ORTP_PUBLIC void meta_rtp_transport_prepend_modifier(RtpTransport *tp,RtpTransportModifier *tpm);
+
+ORTP_PUBLIC int rtp_session_splice(RtpSession *session, RtpSession *to_session);
+ORTP_PUBLIC int rtp_session_unsplice(RtpSession *session, RtpSession *to_session);
+
+ORTP_PUBLIC bool_t ortp_stream_is_ipv6(OrtpStream *os);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpsignaltable.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpsignaltable.h"
new file mode 100755
index 0000000..08a911f
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/rtpsignaltable.h"
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef rtpsignaltable_h
+#define rtpsignaltable_h
+
+#define RTP_CALLBACK_TABLE_MAX_ENTRIES	5
+
+typedef void (*RtpCallback)(struct _RtpSession *, void *arg1, void *arg2, void *arg3);
+
+struct _RtpSignalTable
+{
+	RtpCallback callback[RTP_CALLBACK_TABLE_MAX_ENTRIES];
+	void * user_data[RTP_CALLBACK_TABLE_MAX_ENTRIES];
+	struct _RtpSession *session;
+	const char *signal_name;
+	int count;
+};
+
+typedef struct _RtpSignalTable RtpSignalTable;
+
+void rtp_signal_table_init(RtpSignalTable *table,struct _RtpSession *session, const char *signal_name);
+
+int rtp_signal_table_add(RtpSignalTable *table,RtpCallback cb, void *user_data);
+
+void rtp_signal_table_emit(RtpSignalTable *table);
+
+/* emit but with a second arg */
+void rtp_signal_table_emit2(RtpSignalTable *table, void *arg);
+
+/* emit but with a third arg */
+void rtp_signal_table_emit3(RtpSignalTable *table, void *arg1, void *arg2);
+
+int rtp_signal_table_remove_by_callback(RtpSignalTable *table,RtpCallback cb);
+
+#endif
+
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/sessionset.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/sessionset.h"
new file mode 100755
index 0000000..b082ac0
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/sessionset.h"
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/**
+ * \file sessionset.h
+ * \brief Sending and receiving multiple streams together with only one thread.
+ *
+**/
+#ifndef SESSIONSET_H
+#define SESSIONSET_H
+
+
+#include <ortp/rtpsession.h>
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+#if	!defined(_WIN32) && !defined(_WIN32_WCE)
+/* UNIX */
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#define ORTP_FD_SET(d, s)     FD_SET(d, s)
+#define ORTP_FD_CLR(d, s)     FD_CLR(d, s)
+#define ORTP_FD_ISSET(d, s)   FD_ISSET(d, s)
+#define ORTP_FD_ZERO(s)		  FD_ZERO(s)
+
+typedef fd_set ortp_fd_set;
+
+
+#else
+/* _WIN32 */
+
+#define ORTP_FD_ZERO(s) \
+  do {									      \
+    unsigned int __i;							      \
+    ortp_fd_set *__arr = (s);						      \
+    for (__i = 0; __i < sizeof (ortp_fd_set) / sizeof (ortp__fd_mask); ++__i)	      \
+      ORTP__FDS_BITS (__arr)[__i] = 0;					      \
+  } while (0)
+#define ORTP_FD_SET(d, s)     (ORTP__FDS_BITS (s)[ORTP__FDELT(d)] |= ORTP__FDMASK(d))
+#define ORTP_FD_CLR(d, s)     (ORTP__FDS_BITS (s)[ORTP__FDELT(d)] &= ~ORTP__FDMASK(d))
+#define ORTP_FD_ISSET(d, s)   ((ORTP__FDS_BITS (s)[ORTP__FDELT(d)] & ORTP__FDMASK(d)) != 0)
+
+
+
+/* The fd_set member is required to be an array of longs.  */
+typedef long int ortp__fd_mask;
+
+
+/* Number of bits per word of `fd_set' (some code assumes this is 32).  */
+#define ORTP__FD_SETSIZE 1024
+
+/* It's easier to assume 8-bit bytes than to get CHAR_BIT.  */
+#define ORTP__NFDBITS	(8 * sizeof (ortp__fd_mask))
+#define	ORTP__FDELT(d)	((d) / ORTP__NFDBITS)
+#define	ORTP__FDMASK(d)	((ortp__fd_mask) 1 << ((d) % ORTP__NFDBITS))
+
+
+/* fd_set for select and pselect.  */
+typedef struct
+  {
+    ortp__fd_mask fds_bits[ORTP__FD_SETSIZE / ORTP__NFDBITS];
+# define ORTP__FDS_BITS(set) ((set)->fds_bits)
+  } ortp_fd_set;
+
+
+#endif /*end _WIN32*/
+
+struct _SessionSet
+{
+	ortp_fd_set rtpset;
+};
+
+
+typedef struct _SessionSet SessionSet;
+
+#define session_set_init(ss)		ORTP_FD_ZERO(&(ss)->rtpset)
+
+ORTP_PUBLIC SessionSet * session_set_new(void);
+/**
+ * This macro adds the rtp session to the set.
+ * @param ss a set (SessionSet object)
+ * @param rtpsession a RtpSession
+**/
+#define session_set_set(ss,rtpsession)		ORTP_FD_SET((rtpsession)->mask_pos,&(ss)->rtpset)
+
+/**
+ * This macro tests if the session is part of the set. 1 is returned if true, 0 else.
+ *@param ss a set
+ *@param rtpsession a rtp session
+ *
+**/
+#define session_set_is_set(ss,rtpsession)	ORTP_FD_ISSET((rtpsession)->mask_pos,&(ss)->rtpset)
+
+/**
+ * Removes the session from the set.
+ *@param ss a set of sessions.
+ *@param rtpsession a rtp session.
+ *
+ *
+**/
+#define session_set_clr(ss,rtpsession)		ORTP_FD_CLR((rtpsession)->mask_pos,&(ss)->rtpset)
+
+#define session_set_copy(dest,src)		memcpy(&(dest)->rtpset,&(src)->rtpset,sizeof(ortp_fd_set))
+
+
+/**
+ * Frees a SessionSet.
+**/
+ORTP_PUBLIC void session_set_destroy(SessionSet *set);
+
+
+ORTP_PUBLIC int session_set_select(SessionSet *recvs, SessionSet *sends, SessionSet *errors);
+ORTP_PUBLIC int session_set_timedselect(SessionSet *recvs, SessionSet *sends, SessionSet *errors,  struct timeval *timeout);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/str_utils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/str_utils.h"
new file mode 100755
index 0000000..af6d765
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/str_utils.h"
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef STR_UTILS_H
+#define STR_UTILS_H
+
+
+#include <ortp/port.h>
+#if defined(ORTP_TIMESTAMP)
+#include <time.h>
+#endif
+
+
+#ifndef MIN
+#define MIN(a,b) (((a)>(b)) ? (b) : (a))
+#endif
+#ifndef MAX
+#define MAX(a,b) (((a)>(b)) ? (a) : (b))
+#endif
+
+#define return_if_fail(expr) if (!(expr)) {printf("%s:%i- assertion"#expr "failed\n",__FILE__,__LINE__); return;}
+#define return_val_if_fail(expr,ret) if (!(expr)) {printf("%s:%i- assertion" #expr "failed\n",__FILE__,__LINE__); return (ret);}
+
+
+typedef struct ortp_recv_addr {
+	int family;
+	union {
+		struct in_addr ipi_addr;
+		struct in6_addr ipi6_addr;
+	} addr;
+	unsigned short port;
+} ortp_recv_addr_t;
+
+typedef struct ortp_recv_addr_map {
+	struct sockaddr_storage ss;
+	ortp_recv_addr_t recv_addr;
+	uint64_t ts;
+} ortp_recv_addr_map_t;
+
+typedef struct msgb
+{
+	struct msgb *b_prev;
+	struct msgb *b_next;
+	struct msgb *b_cont;
+	struct datab *b_datap;
+	unsigned char *b_rptr;
+	unsigned char *b_wptr;
+	uint32_t reserved1;
+	uint32_t reserved2;
+	struct timeval timestamp;
+	ortp_recv_addr_t recv_addr; /*contains the destination address of incoming packets, used for ICE processing*/
+	struct sockaddr_storage net_addr; /*source address of incoming packet, or dest address of outgoing packet, used only by simulator and modifiers*/
+	socklen_t net_addrlen; /*source (dest) address of incoming (outgoing) packet length used by simulator and modifiers*/
+	uint8_t ttl_or_hl;
+} mblk_t;
+
+
+
+typedef struct datab dblk_t;
+
+typedef struct _queue
+{
+	mblk_t _q_stopper;
+	int q_mcount;	/*number of packet in the q */
+} queue_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ORTP_PUBLIC void dblk_ref(dblk_t *d);
+ORTP_PUBLIC void dblk_unref(dblk_t *d);
+ORTP_PUBLIC unsigned char * dblk_base(dblk_t *db);
+ORTP_PUBLIC unsigned char * dblk_lim(dblk_t *db);
+ORTP_PUBLIC int dblk_ref_value(dblk_t *db);
+
+ORTP_PUBLIC void qinit(queue_t *q);
+
+ORTP_PUBLIC void putq(queue_t *q, mblk_t *m);
+
+ORTP_PUBLIC mblk_t * getq(queue_t *q);
+
+ORTP_PUBLIC void insq(queue_t *q,mblk_t *emp, mblk_t *mp);
+
+ORTP_PUBLIC void remq(queue_t *q, mblk_t *mp);
+
+ORTP_PUBLIC mblk_t * peekq(queue_t *q);
+
+/* remove and free all messages in the q */
+#define FLUSHALL 0
+ORTP_PUBLIC void flushq(queue_t *q, int how);
+
+ORTP_PUBLIC void mblk_init(mblk_t *mp);
+
+ORTP_PUBLIC void mblk_meta_copy(const mblk_t *source, mblk_t *dest);
+
+/* allocates a mblk_t, that points to a datab_t, that points to a buffer of size size. */
+ORTP_PUBLIC mblk_t *allocb(size_t size, int unused);
+#define BPRI_MED 0
+
+/* allocates a mblk_t, that points to a datab_t, that points to buf; buf will be freed using freefn */
+ORTP_PUBLIC mblk_t *esballoc(uint8_t *buf, size_t size, int pri, void (*freefn)(void*) );
+
+/* frees a mblk_t, and if the datab ref_count is 0, frees it and the buffer too */
+ORTP_PUBLIC void freeb(mblk_t *m);
+
+/* frees recursively (follow b_cont) a mblk_t, and if the datab
+ref_count is 0, frees it and the buffer too */
+ORTP_PUBLIC void freemsg(mblk_t *mp);
+
+/* duplicates a mblk_t , buffer is not duplicated*/
+ORTP_PUBLIC mblk_t *dupb(mblk_t *m);
+
+/* duplicates a complex mblk_t, buffer is not duplicated */
+ORTP_PUBLIC mblk_t	*dupmsg(mblk_t* m);
+
+/* returns the size of data of a message */
+ORTP_PUBLIC size_t msgdsize(const mblk_t *mp);
+
+/* concatenates all fragment of a complex message*/
+ORTP_PUBLIC void msgpullup(mblk_t *mp,size_t len);
+
+/* duplicates a single message, but with buffer included */
+ORTP_PUBLIC mblk_t *copyb(const mblk_t *mp);
+
+/* duplicates a complex message with buffer included */
+ORTP_PUBLIC mblk_t *copymsg(const mblk_t *mp);
+
+ORTP_PUBLIC mblk_t * appendb(mblk_t *mp, const char *data, size_t size, bool_t pad);
+ORTP_PUBLIC void msgappend(mblk_t *mp, const char *data, size_t size, bool_t pad);
+
+ORTP_PUBLIC mblk_t *concatb(mblk_t *mp, mblk_t *newm);
+
+/*Make sure the message has a unique owner, if not duplicate the underlying data buffer so that it can be changed without impacting others.
+ Note that in case of copy, the message will be un-fragmented, exactly the way msgpullup() does. Always returns mp.*/
+ORTP_PUBLIC mblk_t * msgown(mblk_t *mp);
+
+#define qempty(q) (&(q)->_q_stopper==(q)->_q_stopper.b_next)
+#define qfirst(q) ((q)->_q_stopper.b_next!=&(q)->_q_stopper ? (q)->_q_stopper.b_next : NULL)
+#define qbegin(q) ((q)->_q_stopper.b_next)
+#define qlast(q) ((q)->_q_stopper.b_prev!=&(q)->_q_stopper ? (q)->_q_stopper.b_prev : NULL)
+#define qend(q,mp)	((mp)==&(q)->_q_stopper)
+#define qnext(q,mp) ((mp)->b_next)
+
+typedef struct _msgb_allocator{
+	queue_t q;
+}msgb_allocator_t;
+
+ORTP_PUBLIC void msgb_allocator_init(msgb_allocator_t *pa);
+ORTP_PUBLIC mblk_t *msgb_allocator_alloc(msgb_allocator_t *pa, size_t size);
+ORTP_PUBLIC void msgb_allocator_uninit(msgb_allocator_t *pa);
+
+ORTP_PUBLIC void ortp_recvaddr_to_sockaddr(ortp_recv_addr_t *recvaddr, struct sockaddr *addr, socklen_t *socklen);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/telephonyevents.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/telephonyevents.h"
new file mode 100755
index 0000000..360fa64
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/telephonyevents.h"
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** 
+ * \file telephonyevents.h
+ * \brief Receiving and sending telephone events (RFC2833)
+ *
+**/
+
+
+#ifndef TELEPHONYEVENTS_H
+#define TELEPHONYEVENTS_H
+
+#include <ortp/rtpsession.h>
+
+
+struct _telephone_event
+{
+#ifdef ORTP_BIGENDIAN
+	uint32_t event:8;
+	uint32_t E:1;
+	uint32_t R:1;
+	uint32_t volume:6;
+	uint32_t duration:16;
+#else
+	uint32_t event:8;
+	uint32_t volume:6;
+	uint32_t R:1;
+	uint32_t E:1;
+	uint32_t duration:16;
+#endif
+};
+
+typedef struct _telephone_event telephone_event_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* tell if the session supports telephony events. For this the telephony events payload_type 
+	must be present in the rtp profile used by the session */
+	
+/* low level functions */	
+ORTP_PUBLIC int rtp_session_telephone_events_supported(RtpSession *session);
+ORTP_PUBLIC int rtp_session_send_telephone_events_supported(RtpSession *session);
+ORTP_PUBLIC int rtp_session_recv_telephone_events_supported(RtpSession *session);
+ORTP_PUBLIC mblk_t	*rtp_session_create_telephone_event_packet(RtpSession *session, int start);
+
+ORTP_PUBLIC int rtp_session_add_telephone_event(RtpSession *session,
+			mblk_t *packet, uint8_t event, int end, uint8_t volume, uint16_t duration);
+			
+ORTP_PUBLIC int rtp_session_read_telephone_event(RtpSession *session,
+		mblk_t *packet,telephone_event_t **tab);
+
+/* high level functions*/
+ORTP_PUBLIC int rtp_session_send_dtmf(RtpSession *session, char dtmf, uint32_t userts);
+ORTP_PUBLIC int rtp_session_send_dtmf2(RtpSession *session, char dtmf, uint32_t userts, int duration);
+/* for high level telephony event callback */
+ORTP_PUBLIC void rtp_session_check_telephone_events(RtpSession *session, mblk_t *m0);
+
+#ifdef __cplusplus
+}
+#endif
+	
+/* the size allocated for telephony events packets */
+#define TELEPHONY_EVENTS_ALLOCATED_SIZE		(4*sizeof(telephone_event_t))
+
+/* list of named events */
+#define TEV_DTMF_0			(0)
+#define TEV_DTMF_1			(1)
+#define TEV_DTMF_2			(2)
+#define TEV_DTMF_3			(3)
+#define TEV_DTMF_4			(4)
+#define TEV_DTMF_5			(5)
+#define TEV_DTMF_6			(6)
+#define TEV_DTMF_7			(7)
+#define TEV_DTMF_8			(8)
+#define TEV_DTMF_9			(9)
+#define TEV_DTMF_STAR		(10)
+#define TEV_DTMF_POUND		(11)
+#define TEV_DTMF_A			(12)
+#define TEV_DTMF_B			(13)
+#define TEV_DTMF_C			(14)
+#define TEV_DTMF_D			(15)
+#define TEV_FLASH			(16)
+
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/utils.h" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/utils.h"
new file mode 100755
index 0000000..e016e32
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Headers/utils.h"
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2010-2019 Belledonne Communications SARL.
+ *
+ * This file is part of oRTP.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ORTP_UTILS_H
+#define ORTP_UTILS_H
+
+#include "ortp/port.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Utility object to determine a maximum or minimum (but not both at the same
+ * time), of a signal during a sliding period of time.
+ */
+typedef struct _OrtpExtremum{
+	float current_extremum;
+	float last_stable;
+	uint64_t extremum_time;
+	int period;
+}OrtpExtremum;
+ORTP_PUBLIC void ortp_extremum_reset(OrtpExtremum *obj);
+ORTP_PUBLIC void ortp_extremum_init(OrtpExtremum *obj, int period);
+/**
+ * Record a new value for minimal.
+ * @return TRUE if extremum has changed or false otherwise.
+ */
+ORTP_PUBLIC bool_t ortp_extremum_record_min(OrtpExtremum *obj, uint64_t curtime, float value);
+ORTP_PUBLIC bool_t ortp_extremum_record_max(OrtpExtremum *obj, uint64_t curtime, float value);
+ORTP_PUBLIC float ortp_extremum_get_current(OrtpExtremum *obj);
+/**
+ * Unlike ortp_extremum_get_current() which can be very fluctuating, ortp_extremum_get_previous() returns the extremum found for the previous period.
+**/
+ORTP_PUBLIC float ortp_extremum_get_previous(OrtpExtremum *obj);
+
+/**
+ * Utility object to interpolate linear model based on captures with 0-mean noise.
+ * Based on the model (x, y) where y evolves depending on x with relation y = m*x+b,
+ * it will estimate unknown values b, m using given noisy measures xmes and ymes, eg real
+ * system is evolving with: y = m * x + b + noise.
+ * Note: If noise is NOT white, the residue will be absorbed by one of the estimators.
+ * It is an implementation of recursive least square algorithm, based on Kalman filter.
+ */
+typedef struct _OrtpKalmanRLS{
+	/* Unknown parameters to estimate */
+	double m, b;
+	/* Gain matrix, must not be modified */
+	double P[2][2];
+	/** Forgetting factor in [94, .999]. Used when unknown parameters vary in time. **/
+	double lambda;
+}OrtpKalmanRLS;
+
+ORTP_PUBLIC void ortp_kalman_rls_init(OrtpKalmanRLS *obj, double m0, double b0);
+ORTP_PUBLIC void ortp_kalman_rls_record(OrtpKalmanRLS *obj, double xmes, double ymes);
+
+
+typedef struct _OrtpBwEstimator{
+	float one_minus_alpha;
+	float inv_step;
+	float exp_constant;
+	struct timeval last_packet_recv;
+	float value;
+}OrtpBwEstimator;
+
+/**
+ * Utility object to compute a sliding exponential mean bitrate.
+ * @param obj the estimator structure to initialize
+ * @param alpha the weight of previous estimation (between 0 and 1)
+ * @param step a time constant in seconds representing the sampling period
+**/ 
+ORTP_PUBLIC void ortp_bw_estimator_init(OrtpBwEstimator *obj, float alpha, float step);
+
+ORTP_PUBLIC void ortp_bw_estimator_packet_received (OrtpBwEstimator *obj, size_t bytes, const struct timeval *recv_time);
+
+ORTP_PUBLIC float ortp_bw_estimator_get_value(OrtpBwEstimator *obj);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Info.plist" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Info.plist"
new file mode 100755
index 0000000..28786fe
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/Info.plist"
Binary files differ
diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/ortp" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/ortp"
new file mode 100755
index 0000000..5648388
--- /dev/null
+++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/linphone-sdk/apple-darwin/Frameworks/ortp.framework/ortp"
Binary files differ
diff --git a/Shared.IOS.HDLLinphoneSDK/Shared.IOS.HDLLinphoneSDK/ApiDefinition.cs b/Shared.IOS.HDLLinphoneSDK/Shared.IOS.HDLLinphoneSDK/ApiDefinition.cs
index 964bd28..ff407f0 100644
--- a/Shared.IOS.HDLLinphoneSDK/Shared.IOS.HDLLinphoneSDK/ApiDefinition.cs
+++ b/Shared.IOS.HDLLinphoneSDK/Shared.IOS.HDLLinphoneSDK/ApiDefinition.cs
@@ -39,9 +39,9 @@
 		void OnHangUpAction(int callDuration);
 
 		// @required -(void)onScreenshotSuccessfulAction:(UIImage * _Nonnull)image;
-		[Abstract]
-		[Export("onScreenshotSuccessfulAction:")]
-		void OnScreenshotSuccessfulAction(UIImage image);
+		//[Abstract]
+		//[Export("onScreenshotSuccessfulAction:")]
+		//void OnScreenshotSuccessfulAction(UIImage image);
 
 		// @required -(void)onIncomingCall:(NSString * _Nonnull)userName;
 		[Abstract]

--
Gitblit v1.8.0