درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
نشانه
استقرار نسخههای بازبینی میانای برنامهسازی کاربردی پراکسی یا «جریان مشترک» ازطریق «واسط کاربر Edge» یا «میانای برنامهسازی کاربردی مدیریت» با خطای پیکربندی ناموفق بود ناموفق است.
پیام خطا
پیام خطایی در «واسط کاربر Edge» دریافت خواهید کرد، همانطور که در زیر نشان داده شده است:
The revision is deployed, but traffic cannot flow.
com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}
در اینجا نماگرفتی از پیام خطای نمونه مشاهدهشده در «رابط کاربری Edge» آمده است:

علل احتمالی
استقرار «پراکسی API» میتواند بهدلایل مختلفی با خطای «پیکربندی ناموفق بود» ناموفق باشد. جدول زیر چند دلیل رایج مشاهدهشده را که منجر به این خطا میشود فهرست میکند :
| علت | شرح | دستورالعملهای عیبیابی برای |
| «کلاس جاوا» در «خطمشی JavaCallout» وجود ندارد | کلاس Java در فایل JAR که خطمشی JavaCallout به آن ارجاع میدهد وجود ندارد. | کاربران Edge Private Cloud |
| عملوندهای نادرست در شرایط «جریان شرط» استفاده شده است | عملوندها/عبارتهای استفادهشده در یک یا هر دو طرف عملگرها در شرایط معتبر نیستند. | |
| نام میزبان نامعتبر در خطمشی «گزارشگیری پیام» | نام میزبان استفادهشده در خطمشی MessageLogging قابلحل نیست یا ممکن است نویسههای خاص ناخواسته داشته باشد. | |
| نام نقشه مقدار کلید نامعتبر است | KeyValueMap در خطمشی KeyValueMapOperations در «پراکسی API» نامعتبر یا خالی است. |
مراحل تشخیص خرابی رایج
بااستفاده از میانای برنامهسازی کاربردی زیر، وضعیت استقرارها را برای نسخه اصلاحشده خاص «پراکسی API» که خطای استقرار آن را مشاهده میکنید دریافت کنید:
curl -v <management-server-host>:<port#>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>در اینجا نمونهای از برونداد میانای برنامهسازی کاربردی بالا آورده شده است؛
"server" : [ { "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", "status" : "error", "type" : [ "message-processor" ], "uUID" : "0a20926c-f4bf-401b-af84-05fd84b9f492" }, { "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", "status" : "error", "type" : [ "message-processor" ], "uUID" : "f2ee6ab4-a108-4465-a7ba-b56530d8e3fc" }, { "error" : "com.apigee.kernel.exceptions.spi.UncheckedException{ code = application.bootstrap.FailedToConfigure, message = Configuration failed, associated contexts = []}", "status" : "error", "type" : [ "message-processor" ], "uUID" : "0f41991e-b310-4e77-aac5-5fdb150ef9f6" },پیام خطای «پیکربندی ناموفق بود» را در هریک از «پردازندههای پیام» در برونداد وضعیت استقرار خواهید دید.
به سیستم یکی از «پردازشگرهای پیام» وارد شوید و گزارش
/opt/apigee/var/log/edge-message-processor/logs/system.logرا بررسی کنید. ببینید آیا درطول استقرار «پراکسی API» خطایی رخ داده است یا نه.بسته به خطا/استثنایی که در گزارش «پردازشگر پیام» مشاهده میشود، باید مراحل عیبیابی و حلوفصل مناسب را برای مشکل دنبال کنید.
بخشهای زیر برخیاز استثناهای رایج را که منجر به خطای استقرار «پیکربندی ناموفق بود» میشود ارائه میدهد و مراحلی را برای عیبیابی و حلوفصل کردن آنها ارائه میدهد.
علت: کلاس جاوا در خطمشی JavaCallout وجود ندارد
تشخیص
- در گزارشهای «پردازشگر پیام»، اگر درطول استقرار «پراکسی API» (DeployEvent) استثنایی با پیام «Failed to instantiate the JavaCallout Class» (کلاس JavaCallout نمونهسازی نشد) مشاهده کردید، همانطور که در زیر نشان داده شده است، به «مرحله ۲» بروید. اگر نه، به عملوندهای نادرست استفادهشده در شرایط در «جریان شرط» بروید.
«پردازشگر پیام» استثنای زیر را درطول پیادهسازی «پراکسی API» نشان میدهد:
2017-10-10 05:02:42,330 Apigee-Main-5 ERROR MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : error configuring config events [DeployEvent{organization='myorg', application='oauth2', applicationRevision='14', deploymentSpec=basepath=/;env=dev;, deploymentID=null}] com.apigee.kernel.exceptions.spi.UncheckedException: Failed to instantiate the JavaCallout Class com.something.apigee.callout.crypto.main.SecretCallout at com.apigee.steps.javacallout.JavaCalloutStepDefinition.newInstance(JavaCalloutStepDefinition.java:89) ~[javacallout-1.0.0.jar:na] at com.apigee.messaging.runtime.StepDefinition.getStepDefinitionExecution(StepDefinition.java:230) ~[message-processor-1.0.0.jar:na] … <snipped>پیام خطا در استثنای بالا نشان میدهد که کلاس JavaCallout
com.something.apigee.callout.crypto.main.SecretCalloutنمیتواند نمونهسازی شود. این خطا معمولاً زمانی رخ میدهد که کلاس مشخصشده در فایل JAR مشخصشده در خطمشی JavaCallout یا هریک از فایلهای JAR وابسته آن دردسترس نباشد.فایل JAR را که حاوی همه کلاسهای مربوط به بسته
com.something.apigee.callout.crypto.mainاست بررسی کنید و تأیید کنید که کلاس خاصcom.something.apigee.callout.crypto.main.SecretCalloutوجود ندارد.
وضوح
- کلاس جاافتاده را به فایل JAR مشخص اضافه کنید و فایل JAR را بارگذاری کنید.
- «پراکسی میانای برنامهسازی کاربردی» را دوباره مستقر کنید.
- در مثال بالا، مشکل را با روشهای زیر حل کردیم:
- افزودن کلاس جاافتاده
com.something.apigee.callout.crypto.main.SecretCalloutبه فایل JAR. - درحال بارگذاری فایل JAR بهروزشده و استقرار مجدد «پراکسی API».
- افزودن کلاس جاافتاده
علت: عملوندهای نادرست با عملگرها در «جریان شرط» استفاده شده است
تشخیص
در گزارشهای «پردازشگر پیام»، اگر درطول استقرار «پراکسی API» یا «جریان مشترک»
com.apigee.expressions.parser.ParseExceptionرا مشاهده کردید، همانطور که در پیامهای نمونه زیر نشان داده شده است، به «مرحله ۲» بروید. اگر حلوفصل نشد، به دلیل بعدی نام میزبان نامعتبر در خطمشی ثبت پیام بروید.پیام خطای نمونه
com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressionsبیایید به یک مثال نگاه کنیم تا بفهمیم چگونه این مشکل را تشخیص دهیم.
مثال : عملوندهای عبارت <Operator> باید عبارتهای داده باشند
«پردازشگر پیام» استثنای زیر را درطول پیادهسازی «جریان مشترک» نشان میدهد:
2017-11-23 09:11:04,498 Apigee-Main-6 ERROR MESSAGING.RUNTIME - AbstractConfigurator.loadXMLConfigurations() : Unable to Load default for path /organizations/myorg/apiproxies/Introspection/revisions/12/sharedflows/default 2017-11-23 09:11:04,499 Apigee-Main-6 ERROR MESSAGING.RUNTIME - Application.sync() : sync error for Introspection and revision 12 2017-11-23 09:11:04,499 Apigee-Main-6 ERROR MESSAGING.RUNTIME - Application.sync() : Actual Error com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions at com.apigee.expressions.parser.ExpressionParser.buildExpressionTree(ExpressionParser.java:337) ~[expressions-1.0.0.jar:na] at com.apigee.expressions.parser.ExpressionParser.parse(ExpressionParser.java:24) ~[expressions-1.0.0.jar:na] at com.apigee.expressions.parser.ExpressionParser.parseLogicExpression(ExpressionParser.java:28) ~[expressions-1.0.0.jar:na] at com.apigee.messaging.runtime.Step.getExpression(Step.java:67) ~[message-processor-1.0.0.jar:na] at com.apigee.messaging.runtime.Step.handleAdd(Step.java:58) ~[message-processor-1.0.0.jar:na] at com.apigee.messaging.runtime.SharedFlowRuntime.addStep(SharedFlowRuntime.java:81) ~[message-processor-1.0.0.jar:na] … <snipped>پیام خطا در ParseException - «
Both the operands for EQUALS expression should be data expressions» نشان میدهد که شرطی که شامل برابر با (=)، نابرابر با (!=) یا «آمار با» (=|) اپراتور است مشکل دارد.شرایط را در همه «جریانهای شرطی» که شامل عامل خاص ذکرشده در پیام خطا میشود بررسی کنید و ببینید آیا هریک از مشکلات زیر وجود دارد:
- عبارتهای دو طرف عملگر از یک نوع هستند. برای مثال، اگر متغیر رشتهای در سمت چپ عملگر دارید، باید متغیر رشتهای یا مقدار رشتهای دیگری در سمت راست داشته باشید.
- متغیرهای معتبر بین عملگرها استفاده میشوند.
- بین اپراتور و هریک از عبارتها فاصله وجود دارد.
اگر هریک از معیارهای ذکرشده در بالا برآورده نشود، ParseException - «
Both the operands for EQUALS expression should be data expressions» را دریافت میکنید.بیایید برای درک این مشکل به یک مثال نگاه کنیم. در اینجا نمونهای از وضعیت خطا آورده شده است
<Condition> (fault.name = "invalid_access_token") or(fault.name = "ApiKeyNotApproved") </Condition>در این مثال، میتوانید مشاهده کنید که بین عملگر «یا» و شرط بعدی فاصلهای وجود ندارد. بنابراین وقتی شرط دوم تجزیه میشود، عبارت اول بهعنوان «یا(fault.name» برای عملگر EQUALS درنظر گرفته میشود. این نام متغیر معتبری نیست، بنابراین بهعنوان عبارت داده معتبر درنظر گرفته نمیشود. درنتیجه، این استثنا را دریافت میکنید:
com.apigee.expressions.parser.ParseException: Both the operands for EQUALS expression should be data expressions
وضوح
- مطمئن شوید که همیشه در هر دو طرف عملگرها عبارتهای دادهای مناسبی داشته باشید.
در مثال بالا، راهحل این بود که مطمئن شویم پساز عملگر «یا» همانطور که در تکهکد توضیح داده شده است فاصله وجود داشته باشد:
<Condition> (fault.name = "invalid_access_token") or (fault.name = "ApiKeyNotApproved") </Condition>
نام میزبان نامعتبر در خطمشی MessageLogging
تشخیص
در گزارشهای «پردازشگر پیام»، اگر درطول استقرار «پراکسی API» یا «جریان مشترک» استثنایی با پیام «Invalid HostName» (نام میزبان نامعتبر) مشاهده کردید، همانطور که در زیر نشان داده شده است، به «مرحله ۲» بروید. اگر حلوفصل نشد، به دلیل بعدی نام نامعتبر KeyValueMap بروید.
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handlerبیایید به دو مثال زیر نگاه کنیم تا بفهمیم چگونه این مشکل را عیبیابی و حل کنیم.
مثال ۱: HostName دارای نویسه خاص ناخواسته
«پردازشگر پیام» استثنای زیر را درطول پیادهسازی «پراکسی API» نشان میدهد:
2018-01-20 02:12:13,535 Apigee-Main-3 ERROR MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : error configuring config events [DeployEvent{organization='myorg', application='providersearch', applicationRevision='4', deploymentSpec=basepath=/;env=prod;, deploymentID=null}] com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handler at com.apigee.messaging.runtime.destinations.SyslogDestination.<init>(SyslogDestination.java:44) ~[message-processor-1.0.0.jar:na] at com.apigee.messaging.runtime.destinations.SysLoggerFactory.getInstance(SysLoggerFactory.java:39) ~[message-processor-1.0.0.jar:na] at com.apigee.messaging.runtime.destinations.DestinationRegistry.newDestination(DestinationRegistry.java:44) ~[message-processor-1.0.0.jar:na] ...<snipped>استثنای بالا نشان میدهد که استقرار بهدلیل «نام میزبان نامعتبر '<hostname>' برای مدیریتکننده Syslog» ناموفق بوده است. این نشان میدهد که «نام میزبان» استفادهشده در خطمشی MessageLogging نام میزبان نامعتبری است.
بررسی دقیق استثنا در گزارش «پردازشگر پیام» نشان میدهد که نویسه خاص ناخواستهای «/» در انتهای «نام میزبان»
'splunkprod.myorg.com/'.وجود دارداین نویسه ویژه ناخواسته دلیل خطای استقرار بود.
وضوح
- برای حل کردن مشکل، خطمشی MessageLogging را اصلاح کنید تا نویسههای ویژه ناخواسته را بردارید.
- در مثال بالا، نویسه خاص «/» از «خطمشی ثبت گزارش پیام» برداشته شد. این کار مشکل را حل کرد.
مثال ۲: نام میزبان غیرقابلحل
گزارش «پردازشگر پیام» چند خط دارد که نشان میدهد رویداد استقرار برای «پراکسی API» راهاندازی شده است و پساز آن استثنایی رخ میدهد که درطول استقرار «پراکسی API» اتفاق میافتد:
2017-12-22 00:13:49,057 Apigee-Main-87446 INFO MESSAGING.CONFIGURATION - MessageProcessorServiceImpl.configure() : configuring [DeployEvent{organization='myorg', application='myapi', applicationRevision='42', deploymentSpec=basepath=/;env=dev;, deploymentID=null}] 2017-12-22 00:13:49,318 Apigee-Main-87446 ERROR c.a.p.h.d.DNSCachedAddress - DNSCachedAddress.refresh() : Unable to resolve host : input-prd.cloud.splunk.com: Name or service not known 2017-12-22 00:13:49,323 Apigee-Main-87446 ERROR MESSAGING.RUNTIME - AbstractConfigurator.handleUpdate() : Fatal error deploying proxy: {} com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'input-prd.cloud.splunk.com' for Syslog handler at com.apigee.messaging.runtime.destinations.SyslogDestination.<init>(SyslogDestination.java:44) ~[message-processor-1.0.0.jar:na] at com.apigee.messaging.runtime.destinations.SysLoggerFactory.getInstance(SysLoggerFactory.java:39) ~[message-processor-1.0.0.jar:na] at com.apigee.messaging.runtime.destinations.DestinationRegistry.newDestination(DestinationRegistry.java:44) ~[message-processor-1.0.0.jar:na] at com.apigee.steps.messagelogging.MessageLoggingStepDefinition.populateDestinations(MessageLoggingStepDefinition.java:118) ~[message-logging-1.0.0.jar:na] at com.apigee.steps.messagelogging.MessageLoggingStepDefinition.handleAdd(MessageLoggingStepDefinition.java:99) ~[message-logging-1.0.0.jar:na] … <snipped>استثنای بالا نشان میدهد که استقرار بهدلیل «نام میزبان نامعتبر '<hostname>' برای مدیریتکننده Syslog» ناموفق بوده است.
اگر خط بالای استثنا را بخوانید، متوجه میشوید که «پردازشگر پیام» نمیتواند نام میزبان
'input-prd.cloud.splunk.com'ارائهشده در خطمشی MessageLogging را حل کند.برای تأیید این موضوع، میتوانید بااستفاده از نام میزبان و شماره درگاه استفادهشده در خطمشی «گزارشگیری پیام»، به telnet متصل شوید.
خطمشی MessageLogging را در نسخه اصلاحشده خاص «پراکسی میانای برنامهسازی کاربردی» بررسی کنید و نام میزبان و شماره درگاه استفادهشده را درستیسنجی کنید. در مثال بالا، نام «پراکسی API»: myapi، بازبینی: ۴۲.
خطمشی ثبت گزارش پیام
<MessageLogging async="false" continueOnError="false" enabled="true" name="Log-To-Splunk"> <DisplayName>Log-To-Splunk</DisplayName> <Syslog> <Message>Message.id = {request.header.id}</Message> <Host>input-prd.cloud.splunk.com</Host> <Port>2900</Port> <Protocol>TCP</Protocol> <SSLInfo> <Enabled>true</Enabled> </SSLInfo> </Syslog> </MessageLogging>با درگاه مشخص به میزبان Telnet کنید. برای این مثال، telnet را امتحان کردیم و همان خطایی را که در گزارش «پردازشگر پیام» میبینید دریافت کردیم:
telnet input-prd.cloud.splunk.com 2900 telnet: input-prd.cloud.splunk.com: Name or service not known input-prd.cloud.splunk.com: Host name lookup failure
این موضوع بهوضوح ثابت کرد که نام میزبان قابلحل نیست.
وضوح
- خطمشی MessageLogging را اصلاح کنید تا از نام میزبان معتبر استفاده کند.
اگر مشکل همچنان ادامه داشت، به اطلاعات تشخیصی ضروری بروید.
علت: نام نامعتبر KeyValueMap
تشخیص
در گزارشهای «پردازشگر پیام»، اگر هنگام استقرار «پراکسی API» یا «جریان مشترک» استثنایی با پیام «نام KeyValueMap نامعتبر است» مشاهده کردید، همانطور که در زیر نشان داده شده است، به «مرحله ۲» بروید. اگر نه، به باید اطلاعات تشخیص خرابی را جمعآوری کنید بروید.
com.apigee.rest.framework.ValidationException: Invalid syslog config: Invalid HostName 'splunkprod.myorg.com/' for Syslog handlerبیایید به مثالی نگاه کنیم تا بفهمیم چگونه این مشکل را عیبیابی و حل کنیم.
گزارش «پردازشگر پیام» نمونه که استثنا را با پیام «نام KeyValueMap نامعتبر است» نشان میدهد و منجر به خطا درطول استقرار «پراکسی API» میشود
2018-02-27 14:14:50,318 Apigee-Main-6 ERROR MESSAGING.RUNTIME - AbstractConfigurator.handleUpdate() : Fatal error deploying proxy: {} com.apigee.keyvaluemap.KeyValueMapApiException: KeyValueMap name is invalid at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.validateMapName(KeyValueMapServiceImpl.java:125) ~[keyvaluemap-1.0.0.jar:na] at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.createOrUpdateKeyValueMap(KeyValueMapServiceImpl.java:185) ~[keyvaluemap-1.0.0.jar:na] at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.digest(KeyValueMapOperationsStepDefinition.java:180) ~[keyvaluemap-operations-1.0.0.jar:na] at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.handleAdd(KeyValueMapOperationsStepDefinition.java:197) ~[keyvaluemap-operations-1.0.0.jar:na] at com.apigee.entities.AbstractConfigurator.handleUpdate(AbstractConfigurator.java:130) [config-entities-1.0.0.jar:na] at com.apigee.messaging.runtime.Application.handleUpdate(Application.java:229) [message-processor-1.0.0.jar:na] 2018-02-27 14:14:50,344 Apigee-Main-6 ERROR BOOTSTRAP - RuntimeConfigurationServiceImpl.dispatchToListeners() : RuntimeConfigurationServiceImpl.dispatchToListeners : Error occurred while dispatching the request DeployEvent{organization='myorg', application='CustomerAPI', applicationRevision='1', deploymentSpec=basepath=/;env=test;, deploymentID=null} to com.apigee.application.bootstrap.listeners.MessageProcessorBootstrapListener@5009d06e com.apigee.keyvaluemap.KeyValueMapApiException: KeyValueMap name is invalid at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.validateMapName(KeyValueMapServiceImpl.java:125) ~[keyvaluemap-1.0.0.jar:na] at com.apigee.keyvaluemap.service.legacy.KeyValueMapServiceImpl.createOrUpdateKeyValueMap(KeyValueMapServiceImpl.java:185) ~[keyvaluemap-1.0.0.jar:na] at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.digest(KeyValueMapOperationsStepDefinition.java:180) ~[keyvaluemap-operations-1.0.0.jar:na] at com.apigee.steps.keyvaluemapoperations.KeyValueMapOperationsStepDefinition.handleAdd(KeyValueMapOperationsStepDefinition.java:197) ~[keyvaluemap-operations-1.0.0.jar:na] at com.apigee.entities.AbstractConfigurator.handleUpdate(AbstractConfigurator.java:130) ~[config-entities-1.0.0.jar:na] at com.apigee.messaging.runtime.Application.handleUpdate(Application.java:229) ~[message-processor-1.0.0.jar:na]استثنای دوم در بالا نشان میدهد که خطای استقرار برای پراکسی API: CustomerAPI، نسخه: ۱ رخ داده است.
با بررسی پشته ردیابی، میتوانید متوجه شوید که خطا هنگام اجرای خطمشی KeyValuMapOperations ایجاد شده است.
با بررسی بسته «پراکسی API» متوجه میشوید که یک خطمشی KeyValuMapOperations وجود دارد که کد آن بهصورت زیر است:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Pulling-Keys" mapIdentifier=""> <DisplayName>Pulling Keys</DisplayName> <Properties/> <ExclusiveCache>false</ExclusiveCache>همانطور که در بالا میبینید، mapIdentifier که نشاندهنده نام KeyValueMap است، رشتهای خالی دارد. نام KeyValueMap نمیتواند رشته خالی باشد. این دلیل خطای «استقرار» بود.
وضوح
- خطمشی KeyValueMapOperations را اصلاح کنید تا نام معتبر و مناسبی برای KeyValueMap داشته باشد.
در مثال بالا، مشکل را با اصلاح کردن KeyValueMapOperations بهگونهای که نام KeyValueMap را «MyKeyValueMap» داشته باشد، همانطور که در زیر نشان داده شده است، حل کردیم:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <KeyValueMapOperations async="false" continueOnError="false" enabled="true" name="Pulling-Keys" mapIdentifier="MyKeyValueMap"> <DisplayName>Pulling Keys</DisplayName> <Properties/> <ExclusiveCache>false</ExclusiveCache>
باید اطلاعات تشخیص خرابی را جمعآوری کنید
اگر مشکل حتی پساز دنبال کردن دستورالعملهای بالا برطرف نشد، لطفاً اطلاعات تشخیصی زیر را جمعآوری کنید. با پشتیبانی Apigee Edge تماس بگیرید و اطلاعات جمعآوریشده را به آنها ارائه دهید.
برونداد فرمان
curl -v <management-server-host>:<port #>/v1/runtime/organizations/<org-name>/environments/<env-name>/apis/<apiproxy-name>/revisions/deployments -u <user>گزارشهای «پردازشگر پیام»
/opt/apigee/var/log/edge-message-processor/logs/system.logجزئیاتی درباره اینکه کدام بخشهای این «کتابچه راهنما» امتحان شده است و هرگونه اطلاعات آماری دیگری که به ما کمک میکند حل این مشکل را تسریع کنیم.