आईएमएस लागू करना

Android 9 में, ImsService नाम का एक SystemApi इंटरफ़ेस पेश किया गया है. इससे आपको आईपी मल्टीमीडिया सबसिस्टम (आईएमएस) को लागू करने में मदद मिलती है. ImsService API, Android प्लैटफ़ॉर्म और वेंडर या कैरियर की ओर से उपलब्ध कराए गए IMS के बीच एक अच्छी तरह से तय किया गया इंटरफ़ेस है.

ImsService के बारे में खास जानकारी

पहली इमेज. ImsService के बारे में खास जानकारी

ImsService इंटरफ़ेस का इस्तेमाल करके, IMS लागू करने वाला व्यक्ति या कंपनी, प्लैटफ़ॉर्म को सिग्नल से जुड़ी अहम जानकारी दे सकती है. जैसे, IMS रजिस्ट्रेशन की जानकारी, IMS पर एसएमएस इंटिग्रेशन, और MmTel सुविधा का इंटिग्रेशन, ताकि वॉइस और वीडियो कॉलिंग की सुविधा दी जा सके. ImsService API, Android सिस्टम एपीआई भी है. इसका मतलब है कि इसे सोर्स के बजाय सीधे तौर पर Android SDK के साथ बनाया जा सकता है. डिवाइस पर पहले से इंस्टॉल किए गए किसी IMS ऐप्लिकेशन को भी Play Store से अपडेट किया जा सकता है.

उदाहरण और सोर्स

Android, AOSP पर एक ऐसा ऐप्लिकेशन उपलब्ध कराता है जो टेस्टिंग और डेवलपमेंट के मकसद से, ImsService API के कुछ हिस्सों को लागू करता है. आपको यह ऐप्लिकेशन /testapps/ImsTestService पर मिल सकता है.

आपको ImsService API से जुड़ा दस्तावेज़, ImsService और एपीआई की अन्य क्लास में मिल सकता है.

लागू करना

ImsService API एक हाई लेवल एपीआई है. इसकी मदद से, हार्डवेयर की उपलब्धता के आधार पर, IMS को कई तरीकों से लागू किया जा सकता है. उदाहरण के लिए, आईएमएस को लागू करने का तरीका इस बात पर निर्भर करता है कि आईएमएस को पूरी तरह से ऐप्लिकेशन प्रोसेसर पर लागू किया गया है या इसे मॉडम पर आंशिक या पूरी तरह से ऑफलोड किया गया है. Android, बेसबैंड प्रोसेसर पर ऑफ़लोड करने के लिए सार्वजनिक एचएएल उपलब्ध नहीं कराता. इसलिए, किसी भी तरह की ऑफ़लोडिंग, मोडेम के लिए एचएएल एक्सटेंशन का इस्तेमाल करके की जानी चाहिए.

आईएमएस के पुराने वर्शन के साथ काम करने की सुविधा

Android 9 में ImsService API शामिल है. हालांकि, IMS के लिए पुराने वर्शन का इस्तेमाल करने वाले डिवाइसों पर यह एपीआई काम नहीं करता. इन डिवाइसों के लिए, पुराने AIDL इंटरफ़ेस और रैपर क्लास को android.telephony.ims.compat नेमस्पेस में ले जाया गया है. Android 9 पर अपग्रेड करने के बाद, पुराने डिवाइसों को पुराने एपीआई का इस्तेमाल जारी रखने के लिए, यह करना होगा.

  • ImsService लागू करने के लिए, नेमस्पेस को android.telephony.ims.compat नेमस्पेस एपीआई से एक्सटेंड करने के लिए बदलें.
  • AndroidManifest.xml में ImsService सेवा की परिभाषा में बदलाव करके, android.telephony.ims.ImsService ऐक्शन के बजाय android.telephony.ims.compat.ImsService intent-filter ऐक्शन का इस्तेमाल करें.

इसके बाद, फ़्रेमवर्क, Android 9 में उपलब्ध कंपैटिबिलिटी लेयर का इस्तेमाल करके, ImsService से बाइंड हो जाएगा. इससे लेगसी ImsService के साथ काम किया जा सकेगा.

फ़्रेमवर्क के साथ ImsService का रजिस्ट्रेशन

ImsService API को एक सेवा के तौर पर लागू किया जाता है. Android फ़्रेमवर्क, इसे IMS लागू करने के साथ कम्यूनिकेट करने के लिए बाइंड करता है. फ़्रेमवर्क के साथ ImsService लागू करने वाले ऐप्लिकेशन को रजिस्टर करने के लिए, तीन चरण पूरे करना ज़रूरी है. सबसे पहले, ImsService को ऐप्लिकेशन के AndroidManifest.xml का इस्तेमाल करके, प्लैटफ़ॉर्म के साथ रजिस्टर करना होगा. दूसरा, उसे यह तय करना होगा कि वह कौनसी आईएमएस सुविधाओं (MmTel या RCS) के साथ काम करता है. तीसरा, उसे यह पुष्टि करनी होगी कि वह भरोसेमंद आईएमएस सेवा है. यह पुष्टि, कैरियर कॉन्फ़िगरेशन या डिवाइस ओवरले में की जा सकती है.

सेवा की परिभाषा

आईएमएस ऐप्लिकेशन, फ़्रेमवर्क के साथ ImsService रजिस्टर करता है. इसके लिए, वह मेनिफ़ेस्ट में service एंट्री जोड़ता है. इसके लिए, वह इस फ़ॉर्मैट का इस्तेमाल करता है:

<service
    android:name="com.egcorp.ims.EgImsService"
    android:directBootAware="true"
    Android:persistent="true"
    ...
    android:permission="android.permission.BIND_IMS_SERVICE" >
    ...
    <intent-filter>
        <action android:name="android.telephony.ims.ImsService" />
    </intent-filter>
</service>

service की परिभाषा में, यहां दिए गए एट्रिब्यूट शामिल हैं. ये एट्रिब्यूट, सही तरीके से काम करने के लिए ज़रूरी हैं:AndroidManifest.xml

  • directBootAware="true": इससे सेवा को खोजा जा सकता है और उपयोगकर्ता के डिवाइस अनलॉक करने से पहले, telephony इसे चला सकता है. जब तक उपयोगकर्ता डिवाइस को अनलॉक नहीं करता, तब तक सेवा डिवाइस के एन्क्रिप्ट (सुरक्षित) किए गए स्टोरेज को ऐक्सेस नहीं कर सकती. ज़्यादा जानकारी के लिए, डायरेक्ट बूट मोड की सुविधा चालू करना और फ़ाइल-आधारित एन्क्रिप्शन लेख पढ़ें.
  • persistent="true": इससे इस सेवा को लगातार चलाने की अनुमति मिलती है. साथ ही, सिस्टम को मेमोरी वापस पाने के लिए इसे बंद करने की अनुमति नहीं मिलती. यह एट्रिब्यूट सिर्फ़ तब काम करता है, जब ऐप्लिकेशन को सिस्टम ऐप्लिकेशन के तौर पर बनाया गया हो.
  • permission="android.permission.BIND_IMS_SERVICE": इससे यह पक्का किया जाता है कि जिस प्रोसेस को BIND_IMS_SERVICE अनुमति दी गई है सिर्फ़ वही ऐप्लिकेशन से बाइंड हो सकती है. इससे किसी गलत ऐप्लिकेशन को सेवा से बाइंड होने से रोका जा सकता है, क्योंकि फ़्रेमवर्क सिर्फ़ सिस्टम ऐप्लिकेशन को अनुमति दे सकता है.

सेवा को intent-filter एलिमेंट के साथ-साथ कार्रवाई android.telephony.ims.ImsService भी तय करनी होगी. इससे फ़्रेमवर्क को ImsService ढूंढने में मदद मिलती है.

आईएमएस की सुविधा के बारे में जानकारी

AndroidManifest.xml में ImsService को Android सेवा के तौर पर तय करने के बाद, ImsService को यह तय करना होगा कि वह किन आईएमएस सुविधाओं के साथ काम करती है. Android में फ़िलहाल MmTel और RCS, दोनों सुविधाएं काम करती हैं. हालांकि, सिर्फ़ MmTel को फ़्रेमवर्क में इंटिग्रेट किया गया है. हालांकि, फ़्रेमवर्क में कोई आरसीएस एपीआई इंटिग्रेट नहीं किया गया है, लेकिन इसे ImsService की सुविधा के तौर पर घोषित करने के कई फ़ायदे हैं.

नीचे android.telephony.ims.ImsFeature में बताई गई मान्य सुविधाओं के बारे में बताया गया है. ये सुविधाएं, ImsService दे सकती है. साथ ही, यह भी बताया गया है कि कोई IMS ऐप्लिकेशन, इनमें से कोई एक या सभी सुविधाएं क्यों लागू करना चाहेगा. हर सुविधा के बारे में बताने के बाद, इस पेज पर यह बताया गया है कि ImsService, हर सिम स्लॉट के लिए तय की गई सुविधाओं के सेट का एलान कैसे करता है.

FEATURE_MMTEL

ImsService में आईएमएस एमएमटीईएल सुविधा लागू की जाती है. इसमें आईएमएस मीडिया (आईआर.92 और आईआर.94 स्पेसिफ़िकेशन) के लिए सहायता उपलब्ध होती है. हालांकि, आपातकालीन कॉल के लिए आईएमएस पीडीएन से आपातकालीन अटैचमेंट को छोड़कर, सभी आईएमएस मीडिया के लिए सहायता उपलब्ध होती है. ImsService को लागू करने वाले किसी भी ऐप्लिकेशन को MMTEL सुविधाओं के साथ काम करने के लिए, android.telephony.ims.MmTelFeature बेस क्लास को एक्सटेंड करना चाहिए. साथ ही, ImsService#createMmTelFeature में कस्टम MmTelFeature लागू करने की सुविधा देनी चाहिए.

FEATURE_EMERGENCY_MMTEL

इस सुविधा को चालू करने से, प्लैटफ़ॉर्म को सिर्फ़ यह पता चलता है कि आपातकालीन सेवाओं के लिए, IMS PDN से अटैच किया जा सकता है. अगर इस सुविधा के बारे में आपके ImsService के लिए जानकारी नहीं दी गई है, तो प्लैटफ़ॉर्म हमेशा आपातकालीन सेवाओं के लिए सर्किट स्विच फ़ॉलबैक का इस्तेमाल करेगा. इस सुविधा को तय करने के लिए, FEATURE_MMTEL सुविधा तय होनी चाहिए.

FEATURE_RCS

ImsService API, आईएमएस आरसीएस की किसी भी सुविधा को लागू नहीं करता. हालांकि, android.telephony.ims.RcsFeature बेसिक क्लास अब भी काम की हो सकती है. यह फ़्रेमवर्क, ImsService से अपने-आप जुड़ जाता है और ImsService#createRcsFeature को कॉल करता है. ऐसा तब होता है, जब इसे पता चलता है कि पैकेज को आरसीएस की सुविधा देनी चाहिए. अगर आरसीएस सेवा से जुड़ा सिम कार्ड हटा दिया जाता है, तो फ़्रेमवर्क अपने-आप RcsFeature#onFeatureRemoved को कॉल करता है. इसके बाद, आरसीएस सुविधा से जुड़े ImsService को मिटा देता है. इस सुविधा की मदद से, कस्टम डिटेक्शन या बाइंडिंग लॉजिक को हटाया जा सकता है. ऐसा लॉजिक, आरसीएस सुविधा को देना होता है.

इस्तेमाल की जा सकने वाली सुविधाओं का रजिस्ट्रेशन

टेलीफ़ोनी फ़्रेमवर्क, सबसे पहले ImsService से बाइंड होता है. ऐसा इसलिए, ताकि ImsService#querySupportedImsFeatures एपीआई का इस्तेमाल करके, उन सुविधाओं के बारे में क्वेरी की जा सके जिनके साथ यह काम करता है. फ़्रेमवर्क यह कैलकुलेट करता है कि ImsService किन सुविधाओं के साथ काम करेगी. इसके बाद, यह उन सभी सुविधाओं के लिए ImsService#create[...]Feature को कॉल करेगा जिनके लिए ImsService ज़िम्मेदार होगी. अगर आईएमएस ऐप्लिकेशन की सुविधाओं में बदलाव होता है, तो ImsService#onUpdateSupportedImsFeatures का इस्तेमाल करके फ़्रेमवर्क को यह सूचना दी जा सकती है कि वह उपलब्ध सुविधाओं का फिर से हिसाब लगाए. ImsService को शुरू करने और बाइंड करने के बारे में ज़्यादा जानकारी के लिए, यह डायग्राम देखें.

ImsService को शुरू करना और बाइंड करना

दूसरी इमेज. ImsService को शुरू करना और उसे बाइंड करना

ImsService लागू करने की सुविधा का पता लगाना और उसकी पुष्टि करना

AndroidManifext.xml में ImsService को सही तरीके से तय करने के बाद, प्लैटफ़ॉर्म को कॉन्फ़िगर करना होगा, ताकि वह ज़रूरत के मुताबिक ImsService से (सुरक्षित तरीके से) जुड़ सके. फ़्रेमवर्क, दो तरह की ImsServices से बाइंड होता है:

  1. कैरियर "override" ImsService: ये ImsService, डिवाइस में पहले से लोड होती हैं. हालांकि, ये एक या उससे ज़्यादा मोबाइल और इंटरनेट सेवा देने वाली कंपनियों से जुड़ी होती हैं. इन्हें सिर्फ़ तब बाइंड किया जाता है, जब डिवाइस में इनसे मैच करने वाला सिम कार्ड डाला जाता है. इसे
  2. डिवाइस "default" ImsService: यह डिफ़ॉल्ट ImsService है. इसे OEM, डिवाइस पर लोड करता है. इसे इस तरह से डिज़ाइन किया जाना चाहिए कि यह हर स्थिति में IMS सेवाएं दे सके. ऐसा तब होता है, जब कैरियर ImsService उपलब्ध नहीं होती है. यह उन स्थितियों में भी काम आती है जब डिवाइस में कोई सिम कार्ड नहीं डाला गया होता है या डाले गए सिम कार्ड में कैरियर ImsService इंस्टॉल नहीं होती है. इसे डिवाइस ओवरले में, इन कॉन्फ़िगरेशन का इस्तेमाल करके तय किया जाता है:
    • config_ims_mmtel_package: इसमें एमएमटीईएल की सुविधाएं लागू की जाती हैं
    • config_ims_rcs_package: आरसीएस की सुविधाएं लागू करता है

Android, तीसरे पक्ष के डाउनलोड किए जा सकने वाले ImsService को लागू करने वाले ऐप्लिकेशन के साथ काम नहीं करता. इसलिए, यहां तय किए गए किसी भी ImsService को लागू करने के लिए, सिस्टम ऐप्लिकेशन होना ज़रूरी है. साथ ही, सही अनुमतियां देने के लिए, इसे /system/priv-app/ या /product/priv-app/ फ़ोल्डर में होना चाहिए. जैसे, फ़ोन, माइक्रोफ़ोन, जगह की जानकारी, कैमरा, और संपर्क ऐक्सेस करने की अनुमतियां. यह पुष्टि करके कि IMS लागू करने वाले ऐप्लिकेशन के पैकेज का नाम, CarrierConfig या डिवाइस ओवरले की ऊपर बताई गई वैल्यू से मेल खाता है, सिर्फ़ भरोसेमंद और पहले से इंस्टॉल किए गए ऐप्लिकेशन को बाइंड किया जाता है.

पसंद के मुताबिक बनाएं

ImsService लागू करने वाले ऐप्लिकेशन, सिर्फ़ उन डिवाइसों पर काम करते हैं जहां उन्हें मोबाइल और इंटरनेट सेवा देने वाली कंपनी की "override" ImsService या डिवाइस की "default" ImsService के तौर पर कॉन्फ़िगर किया गया है. ऐसा MMTEL या आरसीएस की सुविधा के लिए किया जाता है. ImsService, IMS की उन सुविधाओं (एमएमटीईएल और आरसीएस) को भी चालू या बंद करने की अनुमति देता है जिन्हें यह सपोर्ट करता है. इसके लिए, ImsService#onUpdateSupportedImsFeatures तरीके का इस्तेमाल करके अपडेट किए जाते हैं. इससे फ़्रेमवर्क ट्रिगर होता है. इसके बाद, फ़्रेमवर्क यह फिर से हिसाब लगाता है कि कौनसी ImsServices बाइंड की गई हैं और वे कौनसी सुविधाओं के साथ काम करती हैं. अगर IMS ऐप्लिकेशन, फ़्रेमवर्क को ऐसी सुविधाओं के साथ अपडेट करता है जो काम नहीं करती हैं, तो ImsService तब तक अनबाउंड रहेगी, जब तक फ़ोन को रीबूट नहीं किया जाता या कोई ऐसा नया सिम कार्ड नहीं डाला जाता जो IMS ऐप्लिकेशन से मेल खाता हो.

एक से ज़्यादा ImsService के लिए बाइंडिंग की प्राथमिकता

यह फ़्रेमवर्क, डिवाइस पर पहले से लोड की गई सभी ImsServices से बाइंड नहीं हो सकता. यह हर सिम स्लॉट के लिए, ज़्यादा से ज़्यादा दो ImsServices से बाइंड होगा. हर सुविधा के लिए एक ImsService. यह सुविधा के हिसाब से, इस क्रम में बाइंड होगा:

  1. यह CarrierConfig वैल्यू से तय किया गया ImsService पैकेज का नाम है. config_ims_[mmtel/rcs]_package_override_string यह तब दिखता है, जब सिम कार्ड डाला गया हो.
  2. डिवाइस ओवरले वैल्यू में तय किया गया ImsService पैकेज का नाम. यह config_ims_[mmtel/rcs]_package के लिए होता है. इसमें वह स्थिति भी शामिल है, जब सिम कार्ड नहीं डाला गया हो. इस ImsService में, आपातकालीन MmTel की सुविधा काम करनी चाहिए.

आपके पास, उस पैकेज का इस्तेमाल करने वाले हर कैरियर के लिए, CarrierConfig में तय किए गए ImsService का पैकेज नाम होना चाहिए. इसके अलावा, अगर आपकी ImsService डिफ़ॉल्ट होगी, तो आपके पास डिवाइस ओवरले में तय किए गए ImsService का पैकेज नाम होना चाहिए.

आइए, हर सुविधा के बारे में विस्तार से जानते हैं. एक सिम कार्ड वाले डिवाइस (सिंगल या मल्टी-सिम) में, दो आईएमएस सुविधाएं उपलब्ध होती हैं: एमएमटेल और आरसीएस. फ़्रेमवर्क, हर सुविधा के लिए ऊपर बताए गए क्रम में बाइंड करने की कोशिश करेगा. अगर सुविधा, CarrierConfiguration ओवरराइड में तय की गई ImsService के लिए उपलब्ध नहीं है, तो फ़्रेमवर्क आपकी डिफ़ॉल्ट ImsService पर फ़ॉलबैक करेगा. इसलिए, उदाहरण के लिए, नीचे दी गई टेबल में बताया गया है कि फ़्रेमवर्क, आईएमएस की किस सुविधा का इस्तेमाल करेगा. इसमें तीन आईएमएस ऐप्लिकेशन, ImsServices को लागू करते हैं. ये ऐप्लिकेशन, सिस्टम पर इंस्टॉल किए गए हैं. सिस्टम में ये सुविधाएं हैं:

  • मोबाइल और इंटरनेट सेवा देने वाली कंपनी A की ImsService, आरसीएस की सुविधा देती है
  • मोबाइल और इंटरनेट सेवा देने वाली कंपनी B की ImsService, आरसीएस और MMTel की सुविधा देती है
  • OEM ImsService, आरसीएस और MMTel के साथ काम करता है
सिम कार्ड डाला गया आरसीएस की सुविधा MMTel Feature
मोबाइल और इंटरनेट सेवा देने वाली कंपनी A मोबाइल और इंटरनेट सेवा देने वाली कंपनी A ओईएम
मोबाइल और इंटरनेट सेवा देने वाली कंपनी B मोबाइल और इंटरनेट सेवा देने वाली कंपनी B मोबाइल और इंटरनेट सेवा देने वाली कंपनी B
कोई सिम कार्ड नहीं लगाया गया है ओईएम ओईएम

Validation

आईएमएस को लागू करने की पुष्टि करने वाले टूल शामिल नहीं किए गए हैं, क्योंकि आईएमएस की खास बातें बहुत ज़्यादा हैं और इसके लिए, पुष्टि करने वाले खास उपकरण इस्तेमाल किए जाते हैं. इन टेस्ट से सिर्फ़ यह पुष्टि की जा सकती है कि टेलीफ़ोनी फ़्रेमवर्क, ImsService API को सही तरीके से जवाब देता है.

IMS ऐप्लिकेशन डेवलप करना

Android टेलीफ़ोनी स्टैक के साथ इंटरफ़ेस करने वाला IMS ऐप्लिकेशन डेवलप करते समय, हमारा सुझाव है कि यह बताया जाए कि ऐप्लिकेशन, किसी खास कैरियर की सदस्यता के लिए अटैच किए गए ImsService इंस्टेंस की स्थिति को सुन सकता है या उसमें बदलाव कर सकता है.

एमएमटीईएल और आरसीएस सुविधाओं के लिए, ImsService की स्थिति को सुनने या उसमें बदलाव करने के लिए, ImsManager क्लास का इस्तेमाल करें. इससे आपको ImsMmTelManager, ImsRcsManager या आईएमएस से जुड़ी ProvisioningManager क्लास का इंस्टेंस मिलेगा. इसके बाद, ऐप्लिकेशन IMS से जुड़ी सेवा और प्रोविज़निंग की स्थितियों के बारे में सुन सकता है. जैसे:

  • चालू की गई और उपलब्ध MMTEL या आरसीएस की सुविधाएं
  • IMS रजिस्ट्रेशन की स्थिति में बदलाव होने पर अपडेट होता है
  • IMS की सुविधाओं के लिए सेटअप की स्थिति
  • उपयोगकर्ता ने IMS की कौनसी सुविधाएं चालू की हैं

ImsStateCallback का इस्तेमाल करना

ImsService, हमेशा चालू रहने वाली सेवा है. हालांकि, नया सिम कार्ड या एम्बेड की गई सदस्यता चालू होने पर या कैरियर कॉन्फ़िगरेशन में बदलाव होने पर, बाइंड की गई सेवा बदल सकती है. ImsService, टेलीफ़ोनी प्रोसेस का हिस्सा नहीं है. इसलिए, अगर सदस्यता या कॉन्फ़िगरेशन में बदलाव की वजह से ImsService क्रैश हो जाता है या अनबाउंड हो जाता है, तो IMS API को ऐक्सेस करने की कोशिश करते समय ऐप्लिकेशन को अप्रत्याशित अपवादों का सामना करना पड़ सकता है.

Android 13 या इसके बाद के वर्शन पर काम करने वाले डिवाइसों पर, किसी ऐप्लिकेशन से जुड़ी सदस्यता के लिए ImsService इंस्टेंस उपलब्ध है या नहीं, यह मॉनिटर करने के लिए ऐप्लिकेशन, ImsStateCallback क्लास का इस्तेमाल कर सकता है. ImsMmTelManager या ImsRcsManager का इंस्टेंस पाने के लिए, हमारा सुझाव है कि ऐप्लिकेशन पहले ImsMmTelManager#registerImsStateCallback या ImsRcsManager#registerImsStateCallback का इस्तेमाल करके, आईएमएस स्टेट कॉलबैक के लिए रजिस्टर करे. ImsService के फिर से उपलब्ध होने पर, कुछ खास सदस्यताओं के लिए कॉलबैक अपडेट पाने के लिए, ऐप्लिकेशन को ImsMmTelManager, ImsRcsManager या ProvisioningManager के ज़रिए रजिस्टर किए गए मौजूदा कॉलबैक को रद्द करना होगा या हटाना होगा. साथ ही, नए कॉलबैक रजिस्टर करने होंगे.

अगर कोई ऐसी सदस्यता है जो आईएमएस के साथ काम नहीं करती है, तो फ़्रेमवर्क ImsStateCallback#onUnavailable को कॉल करता है. इसकी वजह REASON_NO_IMS_SERVICE_CONFIGURED होती है. इसका मतलब है कि सदस्यता के लिए, ImsService और आईएमएस से जुड़े एपीआई उपलब्ध नहीं हैं.

अगर टेलीफ़ोनी प्रोसेस क्रैश हो जाती है, तो ऐप्लिकेशन को ImsStateCallback#onError मिलता है. साथ ही, रजिस्टर किए गए ImsStateCallback इंस्टेंस पर अपडेट मिलना बंद हो जाता है. इस समस्या को ठीक करने के लिए, ImsMmTelManager#registerImsStateCallback या ImsRcsManager#registerImsStateCallback को कॉल करके, ImsStateCallback इंस्टेंस को इससे जुड़ी सदस्यता के लिए फिर से रजिस्टर करें.