Skip to content

Commit 0e36d07

Browse files
committedSep 5, 2024·
Update documentation
1 parent 6e7c103 commit 0e36d07

File tree

7 files changed

+80
-35
lines changed

7 files changed

+80
-35
lines changed
 

‎develop/_modules/openvino_xai/api/api.html

+10-7
Original file line numberDiff line numberDiff line change
@@ -398,33 +398,36 @@ <h1>Source code for openvino_xai.api.api</h1><div class="highlight"><pre>
398398
<span></span><span class="c1"># Copyright (C) 2024 Intel Corporation</span>
399399
<span class="c1"># SPDX-License-Identifier: Apache-2.0</span>
400400

401-
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>
401+
<span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">TypeVar</span>
402402

403403
<span class="kn">import</span> <span class="nn">openvino</span> <span class="k">as</span> <span class="nn">ov</span>
404+
<span class="kn">import</span> <span class="nn">torch</span>
404405

405406
<span class="kn">from</span> <span class="nn">openvino_xai.common.parameters</span> <span class="kn">import</span> <span class="n">Method</span><span class="p">,</span> <span class="n">Task</span>
406407
<span class="kn">from</span> <span class="nn">openvino_xai.common.utils</span> <span class="kn">import</span> <span class="n">IdentityPreprocessFN</span><span class="p">,</span> <span class="n">has_xai</span><span class="p">,</span> <span class="n">logger</span>
407408
<span class="kn">from</span> <span class="nn">openvino_xai.methods.factory</span> <span class="kn">import</span> <span class="n">WhiteBoxMethodFactory</span>
408409

410+
<span class="n">Model</span> <span class="o">=</span> <span class="n">TypeVar</span><span class="p">(</span><span class="s2">&quot;Model&quot;</span><span class="p">,</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">,</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">)</span>
411+
409412

410413
<div class="viewcode-block" id="insert_xai">
411414
<a class="viewcode-back" href="../../../api-manual.html#openvino_xai.api.insert_xai">[docs]</a>
412415
<span class="k">def</span> <span class="nf">insert_xai</span><span class="p">(</span>
413-
<span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">,</span>
416+
<span class="n">model</span><span class="p">:</span> <span class="n">Model</span><span class="p">,</span>
414417
<span class="n">task</span><span class="p">:</span> <span class="n">Task</span><span class="p">,</span>
415418
<span class="n">explain_method</span><span class="p">:</span> <span class="n">Method</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
416419
<span class="n">target_layer</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
417420
<span class="n">embed_scaling</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
418421
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
419-
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">:</span>
422+
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Model</span><span class="p">:</span>
420423
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
421-
<span class="sd"> Function that inserts XAI branch into IR.</span>
424+
<span class="sd"> Inserts XAI branch into the given model.</span>
422425

423426
<span class="sd"> Usage:</span>
424427
<span class="sd"> model_xai = openvino_xai.insert_xai(model, task=Task.CLASSIFICATION)</span>
425428

426-
<span class="sd"> :param model: Original IR.</span>
427-
<span class="sd"> :type model: ov.Model | str</span>
429+
<span class="sd"> :param model: Original model.</span>
430+
<span class="sd"> :type model: ov.Model | torch.nn.Module</span>
428431
<span class="sd"> :param task: Type of the task: CLASSIFICATION or DETECTION.</span>
429432
<span class="sd"> :type task: Task</span>
430433
<span class="sd"> :parameter explain_method: Explain method to use for model explanation.</span>
@@ -436,7 +439,7 @@ <h1>Source code for openvino_xai.api.api</h1><div class="highlight"><pre>
436439
<span class="sd"> &quot;&quot;&quot;</span>
437440

438441
<span class="k">if</span> <span class="n">has_xai</span><span class="p">(</span><span class="n">model</span><span class="p">):</span>
439-
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Provided IR model already contains XAI branch, return it as-is.&quot;</span><span class="p">)</span>
442+
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Provided model already contains XAI branch, return it as-is.&quot;</span><span class="p">)</span>
440443
<span class="k">return</span> <span class="n">model</span>
441444

442445
<span class="n">method</span> <span class="o">=</span> <span class="n">WhiteBoxMethodFactory</span><span class="o">.</span><span class="n">create_method</span><span class="p">(</span>

‎develop/_modules/openvino_xai/common/utils.html

+14-10
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,8 @@ <h1>Source code for openvino_xai.common.utils</h1><div class="highlight"><pre>
407407
<span class="kn">from</span> <span class="nn">urllib.request</span> <span class="kn">import</span> <span class="n">urlretrieve</span>
408408

409409
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
410-
<span class="kn">import</span> <span class="nn">openvino.runtime</span> <span class="k">as</span> <span class="nn">ov</span>
410+
<span class="kn">import</span> <span class="nn">openvino</span> <span class="k">as</span> <span class="nn">ov</span>
411+
<span class="kn">import</span> <span class="nn">torch</span>
411412

412413
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s2">&quot;openvino_xai&quot;</span><span class="p">)</span>
413414
<span class="n">handler</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">StreamHandler</span><span class="p">()</span>
@@ -422,20 +423,23 @@ <h1>Source code for openvino_xai.common.utils</h1><div class="highlight"><pre>
422423

423424
<div class="viewcode-block" id="has_xai">
424425
<a class="viewcode-back" href="../../../api-manual.html#openvino_xai.common.has_xai">[docs]</a>
425-
<span class="k">def</span> <span class="nf">has_xai</span><span class="p">(</span><span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
426+
<span class="k">def</span> <span class="nf">has_xai</span><span class="p">(</span><span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span> <span class="o">|</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
426427
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
427428
<span class="sd"> Function checks if the model contains XAI branch.</span>
428429

429-
<span class="sd"> :param model: OV IR model.</span>
430-
<span class="sd"> :type model: ov.Model</span>
430+
<span class="sd"> :param model: Input model for inspect.</span>
431+
<span class="sd"> :type model: ov.Model | torch.nn.Module</span>
431432
<span class="sd"> :return: True is the model has XAI branch and saliency_map output, False otherwise.</span>
432433
<span class="sd"> &quot;&quot;&quot;</span>
433-
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
434-
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Input model has to be ov.Model instance, but got</span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">model</span><span class="p">)</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span>
435-
<span class="k">for</span> <span class="n">output</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">outputs</span><span class="p">:</span>
436-
<span class="k">if</span> <span class="n">SALIENCY_MAP_OUTPUT_NAME</span> <span class="ow">in</span> <span class="n">output</span><span class="o">.</span><span class="n">get_names</span><span class="p">():</span>
437-
<span class="k">return</span> <span class="kc">True</span>
438-
<span class="k">return</span> <span class="kc">False</span></div>
434+
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
435+
<span class="k">for</span> <span class="n">output</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">outputs</span><span class="p">:</span>
436+
<span class="k">if</span> <span class="n">SALIENCY_MAP_OUTPUT_NAME</span> <span class="ow">in</span> <span class="n">output</span><span class="o">.</span><span class="n">get_names</span><span class="p">():</span>
437+
<span class="k">return</span> <span class="kc">True</span>
438+
<span class="k">return</span> <span class="kc">False</span>
439+
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">):</span>
440+
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;has_xai&quot;</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
441+
<span class="k">else</span><span class="p">:</span>
442+
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Input model has to be openvino.Model or torch.nn.Module instance, but got</span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">model</span><span class="p">)</span><span class="si">}</span><span class="s2">.&quot;</span><span class="p">)</span></div>
439443

440444

441445

‎develop/_modules/openvino_xai/methods/white_box/activation_map.html

+13
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ <h1>Source code for openvino_xai.methods.white_box.activation_map</h1><div class
402402

403403
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
404404
<span class="kn">import</span> <span class="nn">openvino.runtime</span> <span class="k">as</span> <span class="nn">ov</span>
405+
<span class="kn">import</span> <span class="nn">torch</span>
405406
<span class="kn">from</span> <span class="nn">openvino.runtime</span> <span class="kn">import</span> <span class="n">opset10</span> <span class="k">as</span> <span class="n">opset</span>
406407

407408
<span class="kn">from</span> <span class="nn">openvino_xai.common.utils</span> <span class="kn">import</span> <span class="n">IdentityPreprocessFN</span>
@@ -430,6 +431,18 @@ <h1>Source code for openvino_xai.methods.white_box.activation_map</h1><div class
430431
<span class="sd"> :type prepare_model: bool</span>
431432
<span class="sd"> &quot;&quot;&quot;</span>
432433

434+
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span>
435+
<span class="bp">cls</span><span class="p">,</span>
436+
<span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span> <span class="o">|</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
437+
<span class="o">*</span><span class="n">args</span><span class="p">,</span>
438+
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
439+
<span class="p">):</span>
440+
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">):</span>
441+
<span class="kn">from</span> <span class="nn">.torch</span> <span class="kn">import</span> <span class="n">TorchActivationMap</span>
442+
443+
<span class="k">return</span> <span class="n">TorchActivationMap</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
444+
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
445+
433446
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
434447
<span class="bp">self</span><span class="p">,</span>
435448
<span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">,</span>

‎develop/_modules/openvino_xai/methods/white_box/base.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ <h1>Source code for openvino_xai.methods.white_box.base</h1><div class="highligh
418418

419419
<div class="viewcode-block" id="WhiteBoxMethod">
420420
<a class="viewcode-back" href="../../../../api-manual.html#openvino_xai.methods.WhiteBoxMethod">[docs]</a>
421-
<span class="k">class</span> <span class="nc">WhiteBoxMethod</span><span class="p">(</span><span class="n">MethodBase</span><span class="p">):</span>
421+
<span class="k">class</span> <span class="nc">WhiteBoxMethod</span><span class="p">(</span><span class="n">MethodBase</span><span class="p">[</span><span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">,</span> <span class="n">ov</span><span class="o">.</span><span class="n">CompiledModel</span><span class="p">]):</span>
422422
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
423423
<span class="sd"> Base class for white-box XAI methods.</span>
424424

@@ -471,15 +471,15 @@ <h1>Source code for openvino_xai.methods.white_box.base</h1><div class="highligh
471471
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Provided IR model already contains XAI branch.&quot;</span><span class="p">)</span>
472472
<span class="bp">self</span><span class="o">.</span><span class="n">_model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model_ori</span>
473473
<span class="k">if</span> <span class="n">load_model</span><span class="p">:</span>
474-
<span class="bp">self</span><span class="o">.</span><span class="n">load_model</span><span class="p">()</span>
474+
<span class="bp">self</span><span class="o">.</span><span class="n">_model_compiled</span> <span class="o">=</span> <span class="n">ov</span><span class="o">.</span><span class="n">Core</span><span class="p">()</span><span class="o">.</span><span class="n">compile_model</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_model</span><span class="p">,</span> <span class="n">device_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_device_name</span><span class="p">)</span>
475475
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model</span>
476476

477477
<span class="n">xai_output_node</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generate_xai_branch</span><span class="p">()</span>
478478
<span class="bp">self</span><span class="o">.</span><span class="n">_model</span> <span class="o">=</span> <span class="n">insert_xai_branch_into_model</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_model_ori</span><span class="p">,</span> <span class="n">xai_output_node</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">embed_scaling</span><span class="p">)</span>
479479
<span class="k">if</span> <span class="ow">not</span> <span class="n">has_xai</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_model</span><span class="p">):</span>
480480
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Insertion of the XAI branch into the model was not successful.&quot;</span><span class="p">)</span>
481481
<span class="k">if</span> <span class="n">load_model</span><span class="p">:</span>
482-
<span class="bp">self</span><span class="o">.</span><span class="n">load_model</span><span class="p">()</span>
482+
<span class="bp">self</span><span class="o">.</span><span class="n">_model_compiled</span> <span class="o">=</span> <span class="n">ov</span><span class="o">.</span><span class="n">Core</span><span class="p">()</span><span class="o">.</span><span class="n">compile_model</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_model</span><span class="p">,</span> <span class="n">device_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_device_name</span><span class="p">)</span>
483483
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_model</span></div>
484484

485485

‎develop/_modules/openvino_xai/methods/white_box/recipro_cam.html

+25
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ <h1>Source code for openvino_xai.methods.white_box.recipro_cam</h1><div class="h
404404

405405
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
406406
<span class="kn">import</span> <span class="nn">openvino.runtime</span> <span class="k">as</span> <span class="nn">ov</span>
407+
<span class="kn">import</span> <span class="nn">torch</span>
407408
<span class="kn">from</span> <span class="nn">openvino.runtime</span> <span class="kn">import</span> <span class="n">opset10</span> <span class="k">as</span> <span class="n">opset</span>
408409

409410
<span class="kn">from</span> <span class="nn">openvino_xai.common.utils</span> <span class="kn">import</span> <span class="n">IdentityPreprocessFN</span>
@@ -483,6 +484,18 @@ <h1>Source code for openvino_xai.methods.white_box.recipro_cam</h1><div class="h
483484
<span class="sd"> :type prepare_model: bool</span>
484485
<span class="sd"> &quot;&quot;&quot;</span>
485486

487+
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span>
488+
<span class="bp">cls</span><span class="p">,</span>
489+
<span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span> <span class="o">|</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
490+
<span class="o">*</span><span class="n">args</span><span class="p">,</span>
491+
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
492+
<span class="p">):</span>
493+
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">):</span>
494+
<span class="kn">from</span> <span class="nn">.torch</span> <span class="kn">import</span> <span class="n">TorchReciproCAM</span>
495+
496+
<span class="k">return</span> <span class="n">TorchReciproCAM</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
497+
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
498+
486499
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
487500
<span class="bp">self</span><span class="p">,</span>
488501
<span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">,</span>
@@ -579,6 +592,18 @@ <h1>Source code for openvino_xai.methods.white_box.recipro_cam</h1><div class="h
579592
<span class="sd"> :type prepare_model: bool</span>
580593
<span class="sd"> &quot;&quot;&quot;</span>
581594

595+
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span>
596+
<span class="bp">cls</span><span class="p">,</span>
597+
<span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span> <span class="o">|</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
598+
<span class="o">*</span><span class="n">args</span><span class="p">,</span>
599+
<span class="o">**</span><span class="n">kwargs</span><span class="p">,</span>
600+
<span class="p">):</span>
601+
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">torch</span><span class="o">.</span><span class="n">nn</span><span class="o">.</span><span class="n">Module</span><span class="p">):</span>
602+
<span class="kn">from</span> <span class="nn">.torch</span> <span class="kn">import</span> <span class="n">TorchViTReciproCAM</span>
603+
604+
<span class="k">return</span> <span class="n">TorchViTReciproCAM</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
605+
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
606+
582607
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
583608
<span class="bp">self</span><span class="p">,</span>
584609
<span class="n">model</span><span class="p">:</span> <span class="n">ov</span><span class="o">.</span><span class="n">Model</span><span class="p">,</span>

‎develop/api-manual.html

+14-14
Large diffs are not rendered by default.

‎develop/searchindex.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
Please sign in to comment.