#Python312
So I'm just YOLOing it now.

New packages to be INSTALLED:
py312-packaging: 26.3 [FreeBSD-ports]
python312: 3.12.14_1 [FreeBSD-ports] (vulnerable!)

I don't know why this old Python stuff is there... I'd be happy to have the latest.
I haven't figured this out in many years of using FreeBSD […]
Original post on mastodon.social
mastodon.social
October 17, 2026 at 12:27 PM
#569117 python311: 3.11.16 -> 3.11.17; python312: 3.12.14 -> 3.12.15
October 2, 2026 at 12:05 AM
python311: 3.11.16 -> 3.11.17; python312: 3.12.14 -> 3.12.15

https://github.com/NixOS/nixpkgs/pull/569117

#security
October 1, 2026 at 7:36 PM
Die Standardversion von #python im #freebsd Ports-Tree wurde auf 3.12 aktualisiert und es stehen neue py312-*-Pakete zur Verfügung.

Hier meine persönliche Reihenfolge damit das Update glatt läuft.

https://bsdbox.de/blog/20260719-python312
FreeBSD Python3.12 Update
Die Standardversion von Python im Ports-Tree wurde auf 3.12 aktualisiert und es stehen neue py312-*-Pakete zur Verfügung. Um Ihre vorhandenen Python-Pakete auf die entsprechenden 312-Versionen zu aktualisieren, verwende folgende Befehle: pkg update # Update pkg Datenbank pkg set -p -n py311-:py312- # Ersetzt py311 mit py312 service SERVICENAME stop # Stoppe vorher die Dienste! pkg upgrade # Das eigentliche Update pkg install python # Hält den Metaport und die Abhängigkeiten konsistent pkg autoremove # Entfernt 3.11 Rest service -R # Alle Dienste neu starten pkg clean -ya # Entfernt alte Paketquellen Die BSDBox ist meine **IT-Spielwiese**. **Professionelle Dienstleistungen** rund um die Themen Netzwerk-, Server- und Struktur-aufbau biete ich mit meiner Firma computing-competence an. Wenn Du diese Inhalte für wertvoll und nützlich hälts, dann freue ich mich über eine Rückmeldung per Matrix, E-Mail oder folge mir doch auf Mastodon.
bsdbox.de
July 19, 2026 at 7:05 PM
Python312 Wheel can be downloaded from
github.com/scottt/rocm-...
Currently tested to work fast for gfx1151 but It should technically support gfx1100,gfx110{1,2,3}, gfx1151 gfx1201, gfx1151. Basically 7900(XT)/7800(XT)/7600(XT)/phoenix, 9070(XT) (navi48) and and strix halo (8060s).
Release Pytorch wheels for gfx110x, gfx1151, and gfx1201 · scottt/rocm-TheRock
Self-contained Pytorch wheels for gfx1100, gfx1101, gfx1102, gfx1103, gfx1151, and gfx1201 GPUs for Python 3.12 on Windows by @jammm Mainly tested and known to run fast on the Strix Halo (gfx1151)...
github.com
May 30, 2025 at 6:12 AM
create mode 100644 lang/python312/Makefile

dass ich das noch erleben darf
April 8, 2025 at 5:07 AM
this machine learning shit is easy, thanks Kagi!
March 18, 2026 at 3:10 PM
and:

[2:19 pkg01 dvl /root/bin] % grep python config.sh
ALL_SETS="${PRIMARY_SETS} ${REGRESSION_SETS} unifi pg16 pg18 php82 python312 python313 python314"

For the nightly script. Let's see if it works.
January 19, 2026 at 2:19 AM
I'm ready for my nightly builds now:

% cd /usr/local/etc/poudriere.d
% cat default-python312-make.conf
DEFAULT_VERSIONS+= python=3.12
% cat default-python313-make.conf
DEFAULT_VERSIONS+= python=3.13
% cat default-python314-make.conf
DEFAULT_VERSIONS+= python=3.14
January 19, 2026 at 2:19 AM
MCP Course: Error when running tiny-agents example
Error when running tiny-agents example I’m following the MCP course and I’m stuck at the end of the MCP Clients section. When running the command “tiny-agents run agent.json” I get the error below. I followed all instructions. What am I missing? An unexpected error occurred: ‘config’ Traceback (most recent call last): File “C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py”, line 134, in run_agent await agent.load_tools() File “C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\agent.py”, line 57, in load_tools await self.add_mcp_server(cfg[“type”], **cfg[“config”]) ~~~^^^^^^^^^^ KeyError: ‘config’ An unexpected error occurred: ‘config’ ╭───────────────────────────────────────── Traceback (most recent call last) ──────────────────────────────────────────╮ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:225 in run │ │ │ │ 222 │ │ raise typer.Exit(code=130) │ │ 223 │ except Exception as e: │ │ 224 │ │ print(f"\n[bold red]An unexpected error occurred: {e}[/bold red]“, flush=True) │ │ ❱ 225 │ │ raise e │ │ 226 │ │ 227 │ │ 228 if **name** == “**main** ”: │ │ │ │ ╭────── locals ───────╮ │ │ │ path = ‘agent.json’ │ │ │ ╰─────────────────────╯ │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:219 in run │ │ │ │ 216 │ ), │ │ 217 ): │ │ 218 │ try: │ │ ❱ 219 │ │ asyncio.run(run_agent(path)) │ │ 220 │ except KeyboardInterrupt: │ │ 221 │ │ print(”\n[red]Application terminated by KeyboardInterrupt.[/red]“, flush=True) │ │ 222 │ │ raise typer.Exit(code=130) │ │ │ │ ╭────── locals ───────╮ │ │ │ path = ‘agent.json’ │ │ │ ╰─────────────────────╯ │ │ │ │ C:\Python312\Lib\asyncio\runners.py:194 in run │ │ │ │ 191 │ │ │ “asyncio.run() cannot be called from a running event loop”) │ │ 192 │ │ │ 193 │ with Runner(debug=debug, loop_factory=loop_factory) as runner: │ │ ❱ 194 │ │ return runner.run(main) │ │ 195 │ │ 196 │ │ 197 def _cancel_all_tasks(loop): │ │ │ │ ╭─────────────────────────────── locals ───────────────────────────────╮ │ │ │ debug = None │ │ │ │ loop_factory = None │ │ │ │ main = <coroutine object run_agent at 0x000001F738D7C9F0> │ │ │ │ runner = <asyncio.runners.Runner object at 0x000001F739D026C0> │ │ │ ╰──────────────────────────────────────────────────────────────────────╯ │ │ │ │ C:\Python312\Lib\asyncio\runners.py:118 in run │ │ │ │ 115 │ │ │ │ 116 │ │ self._interrupt_count = 0 │ │ 117 │ │ try: │ │ ❱ 118 │ │ │ return self._loop.run_until_complete(task) │ │ 119 │ │ except exceptions.CancelledError: │ │ 120 │ │ │ if self._interrupt_count > 0: │ │ 121 │ │ │ │ uncancel = getattr(task, “uncancel”, None) │ │ │ │ ╭───────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────╮ │ │ │ context = <_contextvars.Context object at 0x000001F739D12840> │ │ │ │ coro = <coroutine object run_agent at 0x000001F738D7C9F0> │ │ │ │ self = <asyncio.runners.Runner object at 0x000001F739D026C0> │ │ │ │ sigint_handler = functools.partial(<bound method Runner._on_sigint of <asyncio.runners.Runner object at │ │ │ │ 0x000001F739D026C0>>, main_task=<Task finished name=‘Task-1’ coro=<run_agent() done, defined at │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:28> │ │ │ │ exception=KeyError(‘config’)>) │ │ │ │ task = <Task finished name=‘Task-1’ coro=<run_agent() done, defined at │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:28> │ │ │ │ exception=KeyError(‘config’)> │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ C:\Python312\Lib\asyncio\base_events.py:687 in run_until_complete │ │ │ │ 684 │ │ if not future.done(): │ │ 685 │ │ │ raise RuntimeError(‘Event loop stopped before Future completed.’) │ │ 686 │ │ │ │ ❱ 687 │ │ return future.result() │ │ 688 │ │ │ 689 │ def stop(self): │ │ 690 │ │ “”“Stop running the event loop. │ │ │ │ ╭───────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────╮ │ │ │ future = <Task finished name=‘Task-1’ coro=<run_agent() done, defined at │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:28> │ │ │ │ exception=KeyError(‘config’)> │ │ │ │ new_task = False │ │ │ │ self = │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:194 in run_agent │ │ │ │ 191 │ except Exception as e: │ │ 192 │ │ tb_str = traceback.format_exc() │ │ 193 │ │ print(f”\n[bold red]An unexpected error occurred: {e}\n{tb_str}[/bold red]”, flu │ │ ❱ 194 │ │ raise e │ │ 195 │ │ │ 196 │ finally: │ │ 197 │ │ if sigint_registered_in_loop: │ │ │ │ ╭───────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────╮ │ │ │ abort_event = <asyncio.locks.Event object at 0x000001F739DE9340 [unset]> │ │ │ │ agent = <huggingface_hub.inference._mcp.agent.Agent object at 0x000001F739DE93A0> │ │ │ │ agent_path = ‘agent.json’ │ │ │ │ config = { │ │ │ │ │ ‘model’: ‘Qwen/Qwen2.5-72B-Instruct’, │ │ │ │ │ ‘provider’: ‘nebius’, │ │ │ │ │ ‘servers’: [ │ │ │ │ │ │ {‘type’: ‘stdio’, ‘command’: ‘npx’, ‘args’: [‘@playwright/mcp@latest’]} │ │ │ │ │ ] │ │ │ │ } │ │ │ │ exit_event = <asyncio.locks.Event object at 0x000001F739DE9370 [unset]> │ │ │ │ first_sigint = True │ │ │ │ inputs = │ │ │ │ loop = │ │ │ │ original_sigint_handler = functools.partial(<bound method Runner._on_sigint of <asyncio.runners.Runner object │ │ │ │ at 0x000001F739D026C0>>, main_task=<Task finished name=‘Task-1’ coro=<run_agent() │ │ │ │ done, defined at │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:28> │ │ │ │ exception=KeyError(‘config’)>) │ │ │ │ prompt = None │ │ │ │ servers = [{‘type’: ‘stdio’, ‘command’: ‘npx’, ‘args’: [‘@playwright/mcp@latest’]}] │ │ │ │ sigint_registered_in_loop = False │ │ │ │ tb_str = ‘Traceback (most recent call last):\n File │ │ │ │ “C:\Python312\Lib\site-packag’+346 │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:134 in run_agent │ │ │ │ 131 │ │ │ servers=servers, │ │ 132 │ │ │ prompt=prompt, │ │ 133 │ │ ) as agent: │ │ ❱ 134 │ │ │ await agent.load_tools() │ │ 135 │ │ │ print(f”[bold blue]Agent loaded with {len(agent.available_tools)} tools:[/bo │ │ 136 │ │ │ for t in agent.available_tools: │ │ 137 │ │ │ │ print(f"[blue] • {t.function.name}[/blue]") │ │ │ │ ╭───────────────────────────────────────────────────── locals ─────────────────────────────────────────────────────╮ │ │ │ abort_event = <asyncio.locks.Event object at 0x000001F739DE9340 [unset]> │ │ │ │ agent = <huggingface_hub.inference._mcp.agent.Agent object at 0x000001F739DE93A0> │ │ │ │ agent_path = ‘agent.json’ │ │ │ │ config = { │ │ │ │ │ ‘model’: ‘Qwen/Qwen2.5-72B-Instruct’, │ │ │ │ │ ‘provider’: ‘nebius’, │ │ │ │ │ ‘servers’: [ │ │ │ │ │ │ {‘type’: ‘stdio’, ‘command’: ‘npx’, ‘args’: [‘@playwright/mcp@latest’]} │ │ │ │ │ ] │ │ │ │ } │ │ │ │ exit_event = <asyncio.locks.Event object at 0x000001F739DE9370 [unset]> │ │ │ │ first_sigint = True │ │ │ │ inputs = │ │ │ │ loop = │ │ │ │ original_sigint_handler = functools.partial(<bound method Runner._on_sigint of <asyncio.runners.Runner object │ │ │ │ at 0x000001F739D026C0>>, main_task=<Task finished name=‘Task-1’ coro=<run_agent() │ │ │ │ done, defined at │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\cli.py:28> │ │ │ │ exception=KeyError(‘config’)>) │ │ │ │ prompt = None │ │ │ │ servers = [{‘type’: ‘stdio’, ‘command’: ‘npx’, ‘args’: [‘@playwright/mcp@latest’]}] │ │ │ │ sigint_registered_in_loop = False │ │ │ │ tb_str = ‘Traceback (most recent call last):\n File │ │ │ │ "C:\Python312\Lib\site-packag’+346 │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ C:\Python312\Lib\site-packages\huggingface_hub\inference_mcp\agent.py:57 in load_tools │ │ │ │ 54 │ │ │ 55 │ async def load_tools(self) → None: │ │ 56 │ │ for cfg in self._servers_cfg: │ │ ❱ 57 │ │ │ await self.add_mcp_server(cfg[“type”], **cfg[“config”]) │ │ 58 │ │ │ 59 │ async def run( │ │ 60 │ │ self, │ │ │ │ ╭───────────────────────────────────── locals ─────────────────────────────────────╮ │ │ │ cfg = {‘type’: ‘stdio’, ‘command’: ‘npx’, ‘args’: [‘@playwright/mcp@latest’]} │ │ │ │ self = <huggingface_hub.inference._mcp.agent.Agent object at 0x000001F739DE93A0> │ │ │ ╰──────────────────────────────────────────────────────────────────────────────────╯ │ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ KeyError: ‘config’
discuss.huggingface.co
December 30, 2025 at 12:57 AM
Facing issue using a model hosted on HuggingFace Server and talking to it using API_KEY
I think LangChain has not yet caught up with the changes in Hugging Face’s specifications. github.com/huggingface/huggingface_hub #### API Request issue opened 12:54PM - 31 Mar 25 UTC surya7N C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\redi…s\connection.py:77: UserWarning: redis-py works best with hiredis. Please consider installing warnings.warn(msg) Write Query Here: describe C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\huggingface_hub\utils\\_deprecation.py:131: FutureWarning: 'post' (from 'huggingface_hub.inference._client') is deprecated and will be removed from version '0.31.0'. Making direct POST requests to the inference server is not supported anymore. Please use task methods instead (e.g. `InferenceClient.chat_completion`). If your use case is not supported, please open an issue in https://github.com/huggingface/huggingface_hub. warnings.warn(warning_message, FutureWarning) Traceback (most recent call last): File "C:\Users\Public\CHATBOT\llm_memory_with_Model.py", line 59, in <module> response=qa_chain.invoke({'query': user_query}) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 170, in invoke raise e File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 160, in invoke self._call(inputs, run_manager=run_manager) File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\retrieval_qa\base.py", line 154, in _call answer = self.combine_documents_chain.run( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\\_api\deprecation.py", line 181, in warning_emitting_wrapper return wrapped(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 611, in run return self(kwargs, callbacks=callbacks, tags=tags, metadata=metadata)[ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\\_api\deprecation.py", line 181, in warning_emitting_wrapper return wrapped(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 389, in __call__ return self.invoke( ^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 170, in invoke raise e File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 160, in invoke self._call(inputs, run_manager=run_manager) File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\combine_documents\base.py", line 138, in _call output, extra_return_dict = self.combine_docs( ^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\combine_documents\stuff.py", line 259, in combine_docs return self.llm_chain.predict(callbacks=callbacks, **inputs), {} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\llm.py", line 318, in predict return self(kwargs, callbacks=callbacks)[self.output_key] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\\_api\deprecation.py", line 181, in warning_emitting_wrapper return wrapped(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 389, in __call__ return self.invoke( ^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 170, in invoke raise e File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\base.py", line 160, in invoke self._call(inputs, run_manager=run_manager) File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\llm.py", line 126, in _call response = self.generate([inputs], run_manager=run_manager) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain\chains\llm.py", line 138, in generate return self.llm.generate_prompt( ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\language_models\llms.py", line 763, in generate_prompt return self.generate(prompt_strings, stop=stop, callbacks=callbacks, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\language_models\llms.py", line 966, in generate output = self._generate_helper( ^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\language_models\llms.py", line 787, in _generate_helper self._generate( File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_core\language_models\llms.py", line 1526, in _generate self._call(prompt, stop=stop, run_manager=run_manager, **kwargs) File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\langchain_huggingface\llms\huggingface_endpoint.py", line 312, in _call response = self.client.post( ^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\huggingface_hub\utils\\_deprecation.py", line 132, in inner_f return f(*args, **kwargs) ^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\huggingface_hub\inference\\_client.py", line 302, in post mapped_model = provider_helper._prepare_mapped_model(model or self.model) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\huggingface_hub\inference\\_providers\hf_inference.py", line 35, in _prepare_mapped_model _check_supported_task(model_id, self.task) File "C:\Users\suboyina\AppData\Local\Programs\Python\Python312\Lib\site-packages\huggingface_hub\inference\\_providers\hf_inference.py", line 156, in _check_supported_task raise ValueError( ValueError: Model 'mistralai/Mistral-7B-Instruct-v0.3' doesn't support task 'unknown'. Supported tasks: 'text-generation', got: 'unknown' > Meanwhile, one possible solution would be to downgrade your `huggingface-hub` version to 0.27.1 or below. pip install huggingface_hub<=0.27.1
discuss.huggingface.co
May 11, 2025 at 12:06 PM
I missed that Python 3.12 introduced new generics syntax. Don't need TypeVars anymore.

```
class ClassA[T: str]:
def method1(self) -> T:
...
```

See PEP 695 – Type Parameter Syntax:
peps.python.org/pep-0695/

Real Python also has a nice overview:
realpython.com/python312-ty...
PEP 695 – Type Parameter Syntax | peps.python.org
This PEP specifies an improved syntax for specifying type parameters within a generic class, function, or type alias. It also introduces a new statement for declaring type aliases.
peps.python.org
September 4, 2025 at 2:09 PM
it's been doing that for the last 5 minutes... i think that's going to take a while
April 26, 2025 at 5:03 PM
Upgrade to the latest Python!
Install Python 3.12 on CentOS Stream 10 for access to new features, performance boosts, and modern development tools.

wiki.crowncloud.net?How_to_Insta...

#Python312 #CentOSStream10 #LinuxDev #PythonTips #OpenSource #SysAdmin #TechGuide
How To Install Python On CentOS Stream 10
Light
wiki.crowncloud.net
July 15, 2025 at 12:02 PM
python312-distlib
Low-level components of distutils2/packaging for Python 3.12
aur.archlinux.org
May 17, 2026 at 1:01 PM