nixos/phpfpm: run as non root user for enhanced security

Motivation for this change
Security.
NOTE: I'm not specifically familiar with linux capabilities beyond the man page so if I'm missing anything in AmbientCapabilities or CapabilitiesBoundingSet please let me know.
Things done

[x] Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
Built on platform(s)

[x] NixOS
[ ] macOS
[ ] other Linux distributions

[x] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
[ ] Tested compilation of all pkgs that depend on this change using nix-shell -p nix-review --run "nix-review wip"
[ ] Tested execution of all binary files (usually in ./result/bin/)
[ ] Determined the impact on package closure size (by running nix path-info -S before and after)
[ ] Ensured that relevant documentation is up to date
[ ] Fits CONTRIBUTING.md.

Notify maintainers
cc @

@aanderse I don't have time to review this rn, but I'll do so later. In the meantime: CapabilityBoundingSet is a set of capabilities the service may have at some point, this includes setuid or setcap gained capabilities.
AmbientCapabilities is a set of capabilities the service will just get when not running as root
Example: If your service wants to bind a privileged port (< 1024), and is not running as root, you need to add CAP_NET_BIND_SERVICE to CapabilityBoundingSet (because the process will need it at some point) and AmbientCapabilities (because the process is not running as root and would otherwise not have it).

Having some issues getting this to work properly with socket activation. Will get back to it when I have some time. Any help/testing appreciated.

Having some issues getting this to work properly with socket activation. Will get back to it when I have some time. Any help/testing appreciated.

How do the problems manifest? From my previous socket activation experience, everything seems to be allright? :/

How do the problems manifest? From my previous socket activation experience, everything seems to be allright? :/

After circling back to this I have found the problem! Another case of PEBKAC seems to be the culprit, as I can't reproduce any problems now and everything is running smoothly...
Next steps:

[ ] test without using sockets
[ ] have other people test

@aanderse I think we should add some phpfpm-specific tests to nixos/tests (we currently only test this via other modules which enable it indirectly).
Those should include both connection via unix file sockets and tcp.

@GrahamcOfBorg test phpfpm
@GrahamcOfBorg test limesurvey matomo
@GrahamcOfBorg test mediawiki roundcube
@GrahamcOfBorg test moodle
@GrahamcOfBorg test wordpress
@GrahamcOfBorg test nextcloud.with-postgresql-and-redis

Sorry for the noise up until this point. I believe this PR is ready for review now. Thanks for the help so far.

I rebased on latest master to fix the conflicts.
However, looking at the test updates, this looks we also switch to socket activation by default.
Depending on the environment, some people still might want to autostart the phpfpm pools during boot. Can we add a release note entry, explaining how to get them to autostart (is it just systemd.targets.phpfmp.wantedBy = "multi-user.target"?)

Definitely. Thank you for bringing that point up, it had slipped by me. Consider me on it.

@flokli I brought the slices and targets back in, and modified such that if you want a socket activated service to start right away you can do it per pool by adding this to your configuration: systemd.services.phpfpm-pool.wantedBy = [ "multi-user.target" ];
How does it look now?

Rebased on latest master.
With all the back and forth w.r.t restarting socket units (https://github.com/NixOS/nixpkgs/pull/73871), it might make sense to keep systemd-powered socket activation outside this PR.
@aanderse, WDYT?

It seems that the correct way to make phpfpm run as a non root user is to use systemd. This PR doesn't really aim to accomplish much beyond running as a non root user. I'm happy to let this sit for a while because I don't think there is a great way to accomplish this without systemd sockets.

@aanderse I was playing around with php-fpm and I have it kind of running without socket units. While socket units really are the best solution, I'm working around that with the following systemd service options:
User = "kimai";
AmbientCapabilities = "CAP_CHOWN";

This way, php-fpm is allowed to chown the socket to any user. However, this gets really nasty with the permissions of /run/phpfpm, which is why I believe the best way to solve this are socket units.

@dasJ unfortunately chown could be called on anything by any .php script then. I'm hoping to get back to this after my (apache)[https://github.com/NixOS/nixpkgs/pull/73113] pr is merged.

@Ma27 there are still issues unresolved. I haven't had time to figure out exactly how to reproduce them, but this should not be merged as it will break something. I'm hoping to get back to this at some point...

Found bug - after change pool.${pool}.user and group service php-fpm not restarted.

@Izorkin yeah I'm sort of stuck on this for now. It seems our activation scripts are pretty buggy, especially surrounding sockets, so I'm at a point where I think this PR is stuck until that is fixed.

@aanderse variant without systemd-socket?

@aanderse variant without systemd-socket?

The proper solution is to use a systemd socket, so I think we need to fix our activation scripts.

@Izorkin since you asked on IRC again about letting php-fpm run as a non root user without systemd socket units I thought I should better clarify why that isn't an option that I see working out:

Scenario 1: utilize something like RuntimeDirectory to provision a directory with appropriate permissions for php-fpm to create a socket in.

php-fpm fails with [ERROR] [pool pool1] failed to chown() the socket '/run/php-fpm-pool1/pool1.sock': Operation not permitted (1) when settings."listen.owner" differs from user because php-fpm can't create a socket as a different user.

Scenario 2: start granting AmbientCapabilities like CAP_CHOWN to the systemd service unit

I would ask you consider, but not run, the following script with this scenario: <?php chown('/etc/nixos`); unlink(`/etc/nixos/configuration.nix`); and note how capabilities are passed down from the php-fpm master process to all children processes.

If there is a scenario I have overlooked in which we can run php-fpm as a non root user without utilizing systemd socket units please let me know.
ping @flokli as a reminder of our tentative meeting to discuss switch-to-configuration.pl over the winter break :wink:

I don't see such problems with this patch:
diff --git a/nixos/modules/services/web-servers/phpfpm/default.nix b/nixos/modules/services/web-servers/phpfpm/default.nix
index 4d302299f5f..1aa3fc568d0 100644
--- a/nixos/modules/services/web-servers/phpfpm/default.nix
+++ b/nixos/modules/services/web-servers/phpfpm/default.nix
@@ -5,8 +5,6 @@ with lib;
 let
   cfg = config.services.phpfpm;

-  runtimeDir = "/run/phpfpm";
-
   toStr = value:
     if true == value then "yes"
     else if false == value then "no"
@@ -39,20 +37,11 @@ let
       options = {
         socket = mkOption {
           type = types.str;
+          default = "/run/phpfpm-${name}/${name}.sock";
           readOnly = true;
           description = ''
             Path to the unix socket file on which to accept FastCGI requests.
-            <note><para>This option is read-only and managed by NixOS.</para></note>
-          '';
-          example = "${runtimeDir}/<name>.sock";
-        };
-
-        listen = mkOption {
-          type = types.str;
-          default = "";
-          example = "/path/to/unix/socket";
-          description = ''
-            The address on which to accept FastCGI requests.
+            This option is read-only and reflects the value of "opt-services.phpfpm.pools._name_.listen" if a socket path is specified, and otherwise blank.
           '';
         };

@@ -91,11 +80,13 @@ let
         user = mkOption {
           type = types.str;
           description = "User account under which this pool runs.";
+          example = literalExample "config.services.nginx.user";
         };

         group = mkOption {
           type = types.str;
           description = "Group account under which this pool runs.";
+          example = literalExample "config.services.nginx.group";
         };

         settings = mkOption {
@@ -131,14 +122,14 @@ let
       };

       config = {
-        socket = if poolOpts.listen == "" then "${runtimeDir}/${name}.sock" else poolOpts.listen;
         group = mkDefault poolOpts.user;
         phpOptions = mkBefore cfg.phpOptions;

-        settings = mapAttrs (name: mkDefault){
-          listen = poolOpts.socket;
-          user = poolOpts.user;
-          group = poolOpts.group;
+        settings = mapAttrs (name: mkDefault) {
+          "listen" = poolOpts.socket;
+          "listen.owner" = poolOpts.user;
+          "listen.group" = poolOpts.group;
+          "listen.mode" = "0660";
         };
       };
     };
@@ -154,6 +145,11 @@ in {
       settings = mkOption {
         type = with types; attrsOf (oneOf [ str int bool ]);
         default = {};
+        example = literalExample ''
+          {
+            "log_level" = "debug";
+          }
+        '';
         description = ''
           PHP-FPM global directives. Refer to the "List of global php-fpm.conf directives" section of
           <link xlink:href="https://www.php.net/manual/en/install.fpm.configuration.php"/>
@@ -201,21 +197,51 @@ in {
         type = types.attrsOf (types.submodule poolOpts);
         default = {};
         example = literalExample ''
-         {
-           mypool = {
-             user = "php";
-             group = "php";
-             phpPackage = pkgs.php;
-             settings = {
-               "pm" = "dynamic";
-               "pm.max_children" = 75;
-               "pm.start_servers" = 10;
-               "pm.min_spare_servers" = 5;
-               "pm.max_spare_servers" = 20;
-               "pm.max_requests" = 500;
-             };
-           }
-         }'';
+          {
+            web1 = {
+              user = "nginx";
+              group = "nginx";
+              phpPackage = pkgs.php74;
+              settings = {
+                "pm" = "dynamic";
+                "pm.max_children" = 75;
+                "pm.start_servers" = 10;
+                "pm.min_spare_servers" = 5;
+                "pm.max_spare_servers" = 20;
+                "pm.max_requests" = 500;
+              };
+            }
+
+            web2 = {
+              user = "wwwrun";
+              group = "wwwrun";
+              phpPackage = pkgs.php80;
+              settings = {
+                "pm" = "dynamic";
+                "pm.max_children" = 75;
+                "pm.start_servers" = 10;
+                "pm.min_spare_servers" = 5;
+                "pm.max_spare_servers" = 20;
+                "pm.max_requests" = 500;
+              };
+            }
+
+            web3 = {
+              user = "php";
+              group = "php";
+              settings = {
+                "listen" = "9000";
+                "listen.allowed_clients" = "<IP_ADDRESS>, <IP_ADDRESS>, <IP_ADDRESS>";
+                "pm" = "dynamic";
+                "pm.max_children" = 75;
+                "pm.start_servers" = 10;
+                "pm.min_spare_servers" = 5;
+                "pm.max_spare_servers" = 20;
+                "pm.max_requests" = 500;
+              };
+            };
+          }
+        '';
         description = ''
           PHP-FPM pools. If no pools are defined, the PHP-FPM
           service is disabled.
@@ -227,9 +253,6 @@ in {
   config = mkIf (cfg.pools != {}) {

     warnings =
-      mapAttrsToList (pool: poolOpts: ''
-        Using config.services.phpfpm.pools.${pool}.listen is deprecated and will become unsupported in a future release. Please reference the read-only option config.services.phpfpm.pools.${pool}.socket to access the path of your socket.
-      '') (filterAttrs (pool: poolOpts: poolOpts.listen != "") cfg.pools) ++
       mapAttrsToList (pool: poolOpts: ''
         Using config.services.phpfpm.pools.${pool}.extraConfig is deprecated and will become unsupported in a future release. Please migrate your configuration to config.services.phpfpm.pools.${pool}.settings.
       '') (filterAttrs (pool: poolOpts: poolOpts.extraConfig != null) cfg.pools) ++
@@ -253,15 +276,19 @@ in {
     };

     systemd.services = mapAttrs' (pool: poolOpts:
+      let
+        cfgFile = fpmCfgFile pool poolOpts;
+        iniFile = phpIni poolOpts;
+        createSocket = poolOpts.socket == poolOpts.settings.listen;
+      in
+
       nameValuePair "phpfpm-${pool}" {
         description = "PHP FastCGI Process Manager service for pool ${pool}";
         after = [ "network.target" ];
         wantedBy = [ "phpfpm.target" ];
         partOf = [ "phpfpm.target" ];
-        serviceConfig = let
-          cfgFile = fpmCfgFile pool poolOpts;
-          iniFile = phpIni poolOpts;
-        in {
+
+        serviceConfig = {
           Slice = "phpfpm.slice";
           PrivateDevices = true;
           PrivateTmp = true;
@@ -272,9 +299,13 @@ in {
           Type = "notify";
           ExecStart = "${poolOpts.phpPackage}/bin/php-fpm -y ${cfgFile} -c ${iniFile}";
           ExecReload = "${pkgs.coreutils}/bin/kill -USR2 $MAINPID";
-          RuntimeDirectory = "phpfpm";
-          RuntimeDirectoryPreserve = true; # Relevant when multiple processes are running
           Restart = "always";
+          # User and group
+          User = poolOpts.user;
+          Group = poolOpts.group;
+          # Runtime directory and mode
+          RuntimeDirectory = "phpfpm-${pool}";
+          RuntimeDirectoryMode = "0750";
         };
       }
     ) cfg.pools;

Example configuration:
{ config, pkgs, ... }:
{
  users = {
    users.test-01 = { };
    users.test-02 = { };
    users.test-03 = { };
    groups.test-01 = { members = [ "test-01" ]; };
    groups.test-02 = { members = [ "test-02" ]; };
    groups.test-03 = { members = [ "test-03" ]; };
  };

  services.phpfpm = {
    settings = {
      "log_level" = "notice";
      "syslog.ident" = "php-fpm";
      "emergency_restart_threshold" = "10";
      "emergency_restart_interval" = "60";
      "process_control_timeout" = "10";
      "events.mechanism" = "epoll";
    };
    pools = {
      test-01 = {
        user = "test-01";
        group = "test-01";
        phpPackage = pkgs.php74;
        phpOptions = ''
          allow_url_fopen = On
          max_execution_time = 30
          max_input_time = 30
        '';
        settings = {
          # Pool Process Manager
          "pm" = "dynamic";
          "pm.max_children" = "20";
          "pm.start_servers" = "4";
          "pm.min_spare_servers" = "2";
          "pm.max_spare_servers" = "12";
          "pm.max_requests" = "400";
          # PM Status & ping
          "pm.status_path" = "/status";
          "ping.path" = "/ping";
          # Limits
          "rlimit_core" = "unlimited";
          "rlimit_files" = "131072";
        };
      };
      test-02 = {
        user = "test-02";
        group = "test-02";
        phpPackage = pkgs.php80;
        phpOptions = ''
          allow_url_fopen = On
          max_execution_time = 30
          max_input_time = 30
        '';
        settings = {
          # Pool Process Manager
          "pm" = "dynamic";
          "pm.max_children" = "20";
          "pm.start_servers" = "4";
          "pm.min_spare_servers" = "2";
          "pm.max_spare_servers" = "12";
          "pm.max_requests" = "400";
          # PM Status & ping
          "pm.status_path" = "/status";
          "ping.path" = "/ping";
          # Limits
          "rlimit_core" = "unlimited";
          "rlimit_files" = "131072";
        };
      };
      test-03 = {
        user = "test-03";
        group = "test-03";
        phpPackage = pkgs.php74;
        phpOptions = ''
          allow_url_fopen = On
          max_execution_time = 30
          max_input_time = 30
        '';
        settings = {
          # Listen on port
          "listen" = "9000";
          "listen.allowed_clients" = "<IP_ADDRESS>, <IP_ADDRESS>, <IP_ADDRESS>";
          # Pool Process Manager
          "pm" = "dynamic";
          "pm.max_children" = "20";
          "pm.start_servers" = "4";
          "pm.min_spare_servers" = "2";
          "pm.max_spare_servers" = "12";
          "pm.max_requests" = "400";
          # PM Status & ping
          "pm.status_path" = "/status";
          "ping.path" = "/ping";
          # Limits
          "rlimit_core" = "unlimited";
          "rlimit_files" = "131072";
        };
      };
    };
  };
}

Result:
ls -lah /run | grep phpfpm
drwxr-x---  2 test-01 test-01   60 дек 13 21:07 phpfpm-test-01
drwxr-x---  2 test-02 test-02   60 дек 13 21:07 phpfpm-test-02
drwxr-x---  2 test-03 test-03   40 дек 13 21:07 phpfpm-test-03

sudo ls -lah /run/phpfpm-test-01
итого 0
drwxr-x---  2 test-01 test-01  60 дек 13 21:07 .
drwxr-xr-x 26 root    root    740 дек 13 21:07 ..
srw-rw----  1 test-01 test-01   0 дек 13 21:07 test-01.sock

sudo ls -lah /run/phpfpm-test-02
итого 0
drwxr-x---  2 test-02 test-02  60 дек 13 21:07 .
drwxr-xr-x 26 root    root    740 дек 13 21:07 ..
srw-rw----  1 test-02 test-02   0 дек 13 21:07 test-02.sock

sudo ls -lah /run/phpfpm-test-03
итого 0
drwxr-x---  2 test-03 test-03  40 дек 13 21:07 .
drwxr-xr-x 26 root    root    740 дек 13 21:07 ..

sudo ss -lptun | grep php
tcp   LISTEN 0      0                  *:9000             *:*    users:((".php-fpm-wrappe",pid=51677,fd=9),(".php-fpm-wrappe",pid=51676,fd=9),(".php-fpm-wrappe",pid=51675,fd=9),(".php-fpm-wrappe",pid=51674,fd=9),(".php-fpm-wrappe",pid=51669,fd=6))

sudo ps -aux | grep php-fpm | sort -n
test-01   51664  0.0  1.1<PHONE_NUMBER>0 ?        Ss   21:07   0:00 php-fpm: master process (/nix/store/hrcdm2slax4cf20sq1il1n8w00k4218v-phpfpm-test-01.conf)
test-01   51670  0.0  0.3 441160  7660 ?        S    21:07   0:00 php-fpm: pool test-01
test-01   51671  0.0  0.3 441160  7660 ?        S    21:07   0:00 php-fpm: pool test-01
test-01   51672  0.0  0.3 441160  7660 ?        S    21:07   0:00 php-fpm: pool test-01
test-01   51673  0.0  0.3 441160  7660 ?        S    21:07   0:00 php-fpm: pool test-01
test-02   51667  0.0  1.1<PHONE_NUMBER>8 ?        Ss   21:07   0:00 php-fpm: master process (/nix/store/mnbrrg17ac6sx5in3x4m311f6bnp710h-phpfpm-test-02.conf)
test-02   51678  0.0  0.3 226120  8160 ?        S    21:07   0:00 php-fpm: pool test-02
test-02   51679  0.0  0.3 226120  8160 ?        S    21:07   0:00 php-fpm: pool test-02
test-02   51680  0.0  0.3 226120  8160 ?        S    21:07   0:00 php-fpm: pool test-02
test-02   51681  0.0  0.3 226120  8160 ?        S    21:07   0:00 php-fpm: pool test-02
test-03   51669  0.0  1.1<PHONE_NUMBER>8 ?        Ss   21:07   0:00 php-fpm: master process (/nix/store/7zzwg870v29jfyrdpqv74klnzaljmp66-phpfpm-test-03.conf)
test-03   51674  0.0  0.3 447092  7696 ?        S    21:07   0:00 php-fpm: pool test-03
test-03   51675  0.0  0.3 447092  7696 ?        S    21:07   0:00 php-fpm: pool test-03
test-03   51676  0.0  0.3 447092  7696 ?        S    21:07   0:00 php-fpm: pool test-03
test-03   51677  0.0  0.3 447092  7696 ?        S    21:07   0:00 php-fpm: pool test-03

@Izorkin you must be missing some configuration here because nginx and wwwrun wouldn't have permission to read the sockets created here. Maybe you forgot to add users.users.nginx.extraGroups = [ "test-01" "test-02" ]; to the example you posted?

@aanderse yes, need add users.users.nginx.extraGroups = [ "test-01" "test-02" ];

@Izorkin after playing with systemd sockets and php-fpm again I'm finally convinced we can't ship with systemd socket activation as the default.
I'm closing this PR and will open a new PR which includes your recommendations soon.


Wrong results in small text area with mono space.

There is some problem when the following code is used:
public class JavaFxTest2 extends Application {

    private final StyleClassedTextArea textArea = new StyleClassedTextArea();

    private final VirtualizedScrollPane scrollPane = new VirtualizedScrollPane(textArea);

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        var s = "org.fxmisc.richtext.StyleClassedTextArea" + System.lineSeparator();
        s += "fxmisc.richtext.StyleClassedTextArea" + System.lineSeparator();
        s += "StyleClassedTextArea" + System.lineSeparator();
        VBox.setVgrow(textArea, Priority.ALWAYS);
        VBox root = new VBox();

        root.getChildren().addAll(textArea);
        textArea.append(s, "base");
        textArea.setWrapText(true);
        var css= this.getClass().getResource("test2.css").toExternalForm();
        var scene = new Scene(root, 150, 150);
        scene.getStylesheets().add(css);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

And CSS:
.base {
    -fx-font-family: 'DejaVu Sans Mono';
    -fx-font-size: 15px;
    -fx-fill:black;
}

And this is the result:

At the same time, if you change the size of the window (text area), then everything is ok:

System Info: openjdk: 14.0.2, JavaFX: 19-ea+3, richtextfx: 0.10.9, OS: Ubuntu 20.04.3

@Jugen Could you give just a hint what is the problem here. Is this a bug or I do something wrong?

Try moving textArea.append( s, "base" ); to after primaryStage.show(); and it should render correctly.

@Jugen Yes, your solution helped for the test I posted. But could you explain the reasons of such behavior? I am asking, as in my real application I have floating window (with text area) in stack pane:

When I scroll up/down in list view text area is cleared and new text is appended. I mean that only one instance of text area is used, it is visible and text is cleared and appended when text area is visible. I can't understand what is wrong here.

Initially I thought that it's just because the RichTextFX component sometimes doesn't like its contents being changed unless its part of a scene/stage. However from your use case/screenshot it's clear that that's not the problem.
Further investigation seems to indicate (I think) that the incorrect rendering only occurs in the 1st paragraph. So if you prefix the text with "\n" then it renders correctly. Strange ???

@Jugen Any ideas? Is this a bug? If it is when approximately it can be fixed? I just want to understand what I should do with my project.

Have dug into this a bit more now and the problem is that sometimes the very first Paragraph/Node isn't connected to the Scene graph yet which results in the preferred height calculation being incorrect. This is mainly evident when the font size is increased.
I unfortunately don't know why this happens so can't fix it, but it can be detected and then corrected with an additional requestLayout. So I'm going to evaluate this and see. If you can use a fat jar of RichTextFX then I can provide it for you to evaluate as well ?

@Jugen Thank you very much for your help. I am using JPMS framework, so I can work only with modules. This is what I have in my config:
<!--### RICH TEXT ###-->
<module groupId="org.fxmisc.richtext" artifactId="richtextfx" version="0.10.9" />
<module groupId="org.fxmisc.flowless" artifactId="flowless" version="0.6.9" />
<module groupId="org.fxmisc.undo" artifactId="undofx" version="2.1.1" />
<module groupId="org.fxmisc.wellbehaved" artifactId="wellbehavedfx" version="0.3.3" />
<module groupId="org.reactfx" artifactId="reactfx" version="2.0-M5" />

But you can modify any modules and I will test everything you say without any problems.

@PashaTurok Okay, please try changing the flowless module to version 0.6.10 and give feedback as to how it behaves.

@Jugen I tested. Now it is working. But when text is replaced it a little bit dancing. Please, see attached video.
https://user-images.githubusercontent.com/10261361/173555231-2b140318-8fe7-4c33-a8cd-69cfd20156c5.mp4

@PashaTurok  Thanks for video feedback :-) !   Yeah, I thought that might happen :-( was hoping it wouldn't be so bad.
Can you please send me the code for the demo in the video, so I can test alternative solutions.

@Jugen Yes, thank you very much. VirtualizedScrollPane helped. Maybe that's why it was so difficult to reproduce this dancing. So, should I close this issue?


Access to pod from external system in same VNET of Kubernetes cluster

Hi,
I have a Kubernetes cluster with calico and created an ippool with pods address CIDR as mentioned in #439
With this configuration I can access to external systems from the pods, but cannot access directly to pods (10.244.x.x) from an external system in the same vnet.
There is any solution for this requirement?

@simonswine @colemickens Do either of you know the solution to this?

Currently dealing with the same (as in trying to access cluster services from other service in the same VNET) situation. Is there any answer for this?


repo size

Hi,
I am concerned with the repo size in case I add it as a submodule:
The whole LuaJIT-ImGui repo (with cimgui and imgui as submodules) has 67.6 Mb (where only 9.64 Mb are from code and the rest from .git folder)
In imGuiZMO.quat with only 100 Kb needed, the whole repo has 82.3 Mb (with 24.5 Mb from the .git folder)
Not being a git expert, I dont know if something could be done.
Thanks for you attention.

Ciao.
Thanks to reporting it
Honestly neither am I expert of github... but just now, looking in the repository directory, I found a VStudio DB file (49MB used from debug and not necessary to project, in the in a example/vs2017 sub-sub-folder)
I'll remove it!
About .git folder...
Now I see if I can make it smaller/purge some elements (perhaps there are some olden copies of that DB file)

Now it is much less 34 Mb!!
Althought the code is 10 Mb only, the rest is .git folder.
May be old VStudio DBs...?

I'm sorry ... wait just a moment... ;-)
I have just reduced also the .git size from 23MB to 5MB (removing internal .db cached file) ... but not still committed ... because i am trying to remove also GLM lib, not more required: now there is the internal vgMath
So I need just a little more time...

Try now... corrently my local imGuIZMO.quat.git folder is about 8/9 MB ...
Perhaps i can delete also cached (updated images) ... just now backup the repository and after I try also that ;)

I had to delete and remove. Git refused to pull because fatal: refusing to merge unrelated histories
But now its 32 Mb  of which 24.2 Mb are .git

Currently I reduced repository in local to only 2.5MB in total, moving images and live demo...
I tried a git push --force, but remote .git folder remains of 24MB...
Now i try to resolve this last problem... ;)

Mission accomplished
Now with the clone command I download only 2.4MB (for whole repo)
I just had forgotten the --mirror flag when when I had cloned before to shrink...
Now should be all right

Great!!
Completely squashed to 6 Mb!!

Just added to LuaJIT-ImGui
Thanks again!!

Thanks to you to add ImGuIZMO.quat
Adding... just a question
I downloaded LuaJIT-ImGui and the extras/ImGuIZMO.quat folder is empty.
It's normal?
(also from github webPage it is empty)

I always forget things!!
.gitmodules was not set, now it is.

No problem... you're not the only one... ;)
Now it appears.
Thanks again.

but I still have to try to build it)

To use imgui glfw or sdl is needed.
If you want to try it better build https://github.com/sonoro1234/anima which has LuaJIT-ImGui but also LuaJIT-GLFW.
Please tell me if you have any problem!!


UHF-10737: configure core file delete

Codecov Report
All modified and coverable lines are covered by tests :white_check_mark:

Project coverage is 54.36%. Comparing base (88aedf8) to head (8f2faa2).
Report is 6 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff              @@
##               main      #35      +/-   ##
============================================
- Coverage     55.17%   54.36%   -0.81%
- Complexity       60       61       +1
============================================
  Files             4        4
  Lines           203      206       +3
============================================
  Hits            112      112
- Misses           91       94       +3

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.


linux-htb QoS priority values only range from 0 to 7

Expected Behavior
I'm following the linux-htb documentation for kube-ovn here. I've created a pod annotated with ovn.kubernetes.io/priority: "50":
kind: Pod
apiVersion: v1
metadata:
  name: perf
  annotations:
    ovn.kubernetes.io/priority: "50"
spec:
  containers:
  - name: nginx
    image: kubeovn/perf

I can see the priority="50" value in vsctl:
$ kubectl ko vsctl juju-0b8517-2 list qos
_uuid               : 1c8fabd5-6c42-42d9-a520-f737c7448853
external_ids        : {iface-id=perf.default, pod="default/perf"}
other_config        : {}
queues              : {0=ff2bafd6-b440-49df-9f8e-681bf0d9065e}
type                : linux-htb

_uuid               : 2865300b-8c67-4d62-9f78-50d96502f2b7
external_ids        : {}
other_config        : {}
queues              : {}
type                : linux-noop

$ kubectl ko vsctl juju-0b8517-2 list queue
_uuid               : ff2bafd6-b440-49df-9f8e-681bf0d9065e
dscp                : []
external_ids        : {iface-id=perf.default, pod="default/perf"}
other_config        : {priority="50"}

But I want to go deeper and see how HTB is configured. I should be able to use the tc command to see that priority=50 value somewhere in HTB qdisc configuration, right?
Actual Behavior
If I ssh to the node that the pod landed on, I can see the pod's interface:
$ ip link | grep htb
19: 1ec6889fb027_h@if18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc htb master ovs-system state UP mode DEFAULT group default qlen 1000

But if I look at the HTB classes on that interface:
$ tc class show dev 1ec6889fb027_h
class htb 1:1 parent 1:fffe prio 7 rate 11200bit ceil 10Gbit burst 1463b cburst 1250b
class htb 1:fffe root rate 10Gbit ceil 10Gbit burst 1250b cburst 1250b

The prio value is set to 7, not 50. Why is that?
If I change the pod's priority annotation to 3, then the priority annotation and the class prio values match:
$ kubectl patch po perf -p '{"metadata": {"annotations": {"ovn.kubernetes.io/priority": "3"}}}'
pod/perf patched

$ tc class show dev 1ec6889fb027_h
class htb 1:1 parent 1:fffe prio 3 rate 11200bit ceil 10Gbit burst 1463b cburst 1250b
class htb 1:fffe root rate 10Gbit ceil 10Gbit burst 1250b cburst 1250b

But any time I specify a priority value above 7, the prio value on the class does not go higher. For example, here I try setting it to 8:
$ kubectl patch po perf -p '{"metadata": {"annotations": {"ovn.kubernetes.io/priority": "8"}}}'
pod/perf patched

$ tc class show dev 1ec6889fb027_h
class htb 1:1 parent 1:fffe prio 7 rate 11200bit ceil 10Gbit burst 1463b cburst 1250b
class htb 1:fffe root rate 10Gbit ceil 10Gbit burst 1250b cburst 1250b

Steps to Reproduce the Problem

Create a pod with ovn.kubernetes.io/priority: "50" annotation
ssh to the node that the pod was scheduled to, use ip link to find the pod's network interface
run tc class show dev <link> to see that the htb prio value doesn't match

Additional Info

Kubernetes version:
$ kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version --short.  Use --
output=yaml|json to get the full version.
Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8",
GitTreeState:"clean", BuildDate:"2022-06-17T22:28:26Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v4.5.4
Server Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.2", GitCommit:"f66044f4361b9f1f96f0053dd46cb7dce5e990a8",
GitTreeState:"clean", BuildDate:"2022-06-17T21:59:56Z", GoVersion:"go1.18.3", Compiler:"gc", Platform:"linux/amd64"}

kube-ovn version:
v1.9.2

operation-system/kernel version:
$ awk -F '=' '/PRETTY_NAME/ { print $2 }' /etc/os-release
"Ubuntu 20.04.4 LTS"

$ uname -r
5.4.0-120-generic

This limitation seems to exist in Linux. I see the same behavior if I try to create an HTB class with tc directly. Prio values never go above 7:
$ tc class add dev 1ec6889fb027_h parent 1:fffe classid 1:2 htb rate 1Kbit prio 8
$ tc class show dev 1ec6889fb027_h classid 1:2
class htb 1:2 parent 1:fffe prio 7 rate 1Kbit ceil 1Kbit burst 1600b cburst 1600b

and I think this is where the number of priorities is defined in Linux source: https://github.com/torvalds/linux/blob/72a8e05d4f66b5af7854df4490e3135168694b6b/include/uapi/linux/pkt_sched.h#L405
So I don't really expect values above 7 to work, but rather, I think the kube-ovn documentation and defaults need to be updated to keep HTB priority values in the range 0 to 7

@Cynerva Thanks for the report. We will modify our document and releated code later.


Unable to build project with dependencies

I have included all implementation fileTree(dir: "libs", include: ["library-*.aar"]) arr files and tried to build the project with
gradle:7.0.3 and in app gradle
def exoplayerVersion = '2.16.0'

    implementation("com.google.android.exoplayer:exoplayer-datasource:$exoplayerVersion") {
        exclude group: "com.google.android.exoplayer", module: "exoplayer-common"
    }
    implementation("com.google.android.exoplayer:exoplayer-decoder:$exoplayerVersion") {
        exclude group: "com.google.android.exoplayer", module: "exoplayer-common"
    }
    implementation("com.google.android.exoplayer:exoplayer-database:$exoplayerVersion") {
        exclude group: "com.google.android.exoplayer", module: "exoplayer-common"
    }
    implementation("com.google.android.exoplayer:extension-mediasession:$exoplayerVersion") {
        exclude group: "com.google.android.exoplayer", module: "exoplayer-common"
    }
    implementation("com.google.android.exoplayer:exoplayer-dash:$exoplayerVersion") {
        exclude group: "com.google.android.exoplayer", module: "exoplayer-core"
    }
    implementation("com.google.android.exoplayer:exoplayer-hls:$exoplayerVersion") {
        exclude group: "com.google.android.exoplayer", module: "exoplayer-core"
    }
    implementation("com.google.android.exoplayer:exoplayer-smoothstreaming:$exoplayerVersion") {
        exclude group: "com.google.android.exoplayer", module: "exoplayer-core"
    }
    implementation("com.google.android.exoplayer:exoplayer-rtsp:$exoplayerVersion") {
        exclude group: "com.google.android.exoplayer", module: "exoplayer-core"
    }
    api ('com.google.guava:guava:27.1-android') {
        exclude group: 'com.google.code.findbugs', module: 'jsr305'
        exclude group: 'org.checkerframework', module: 'checker-compat-qual'
        exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
        exclude group: 'com.google.j2objc', module: 'j2objc-annotations'
        exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
    }

when i sync i get following error saying
Duplicate class com.google.android.exoplayer2.BasePlayer found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.BundleListRetriever found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Bundleable found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Bundleable$Creator found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$AudioAllowedCapturePolicy found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$AudioContentType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$AudioFlags found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$AudioFocusGain found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$AudioManagerOffloadMode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$AudioUsage found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$BufferFlags found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$ColorRange found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$ColorSpace found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$ColorTransfer found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$ContentType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$CryptoMode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$CryptoType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$DataType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$Encoding found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$FormatSupport found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$NetworkType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$PcmEncoding found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$Projection found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$RoleFlags found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$SelectionFlags found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$SelectionReason found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$StereoMode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$StreamType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$TrackType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$VideoChangeFrameRateStrategy found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$VideoOutputMode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$VideoScalingMode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.C$WakeMode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.DeviceInfo found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.DeviceInfo$PlaybackType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ExoPlayerLibraryInfo found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Format found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Format$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Format$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ForwardingPlayer found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ForwardingPlayer$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ForwardingPlayer$ForwardingEventListener found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ForwardingPlayer$ForwardingListener found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.HeartRating found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.IllegalSeekPositionException found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$AdsConfiguration found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$AdsConfiguration$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$ClippingConfiguration found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$ClippingConfiguration$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$ClippingProperties found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$DrmConfiguration found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$DrmConfiguration$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$LiveConfiguration found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$LiveConfiguration$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$LocalConfiguration found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$PlaybackProperties found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$Subtitle found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$SubtitleConfiguration found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaItem$SubtitleConfiguration$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaMetadata found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaMetadata$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaMetadata$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaMetadata$FolderType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.MediaMetadata$PictureType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ParserException found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.PercentageRating found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.PlaybackException found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.PlaybackException$ErrorCode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.PlaybackParameters found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$Command found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$Commands found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$Commands$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$DiscontinuityReason found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$Event found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$EventListener found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$Events found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$Listener found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$MediaItemTransitionReason found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$PlayWhenReadyChangeReason found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$PlaybackSuppressionReason found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$PositionInfo found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$RepeatMode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$State found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Player$TimelineChangeReason found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Rating found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.StarRating found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ThumbRating found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Timeline found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Timeline$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Timeline$Period found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Timeline$RemotableTimeline found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.Timeline$Window found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.TracksInfo found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.TracksInfo$TrackGroupInfo found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.audio.AudioAttributes found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.audio.AudioAttributes$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.audio.AudioAttributes$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.audio.AuxEffectInfo found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.audio.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.common.BuildConfig found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.drm.DrmInitData found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.drm.DrmInitData$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.drm.DrmInitData$SchemeData found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.drm.DrmInitData$SchemeData$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.drm.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.metadata.Metadata found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.metadata.Metadata$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.metadata.Metadata$Entry found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.offline.StreamKey found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.offline.StreamKey$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.offline.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.source.MediaPeriodId found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.source.TrackGroup found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.source.TrackGroupArray found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.source.ads.AdPlaybackState found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.source.ads.AdPlaybackState$AdGroup found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.source.ads.AdPlaybackState$AdState found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.source.ads.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.source.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.Cue found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.Cue$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.Cue$AnchorType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.Cue$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.Cue$LineType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.Cue$TextSizeType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.Cue$VerticalType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.HorizontalTextInVerticalContextSpan found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.LanguageFeatureSpan found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.RubySpan found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.SpanUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.TextAnnotation found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.TextAnnotation$Position found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.TextEmphasisSpan found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.TextEmphasisSpan$MarkFill found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.TextEmphasisSpan$MarkShape found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.text.span.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelection found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelection$Type found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelectionArray found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelectionOverrides$TrackSelectionOverride found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelectionParameters found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.TrackSelectionParameters$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.trackselection.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ui.AdOverlayInfo found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ui.AdOverlayInfo$Purpose found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ui.AdViewProvider found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.ui.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.upstream.DataReader found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.Assertions found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.AtomicFile found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.AtomicFile$AtomicFileOutputStream found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.BundleUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.BundleableUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.Clock found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.CodecSpecificDataUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ColorParser found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ConditionVariable found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.Consumer found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.CopyOnWriteMultiset found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.EGLSurfaceTexture found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.EGLSurfaceTexture$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.EGLSurfaceTexture$GlException found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.EGLSurfaceTexture$SecureMode found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.EGLSurfaceTexture$TextureImageListener found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ErrorMessageProvider found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.FileTypes found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.FileTypes$Type found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.FlagSet found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.FlagSet$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.FlagSet$Builder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.GlUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.GlUtil$Api17 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.GlUtil$Attribute found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.GlUtil$GlException found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.GlUtil$Program found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.GlUtil$Uniform found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.GlUtil$UnsupportedEglVersionException found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.HandlerWrapper found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.HandlerWrapper$Message found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.LibraryLoader found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ListenerSet found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ListenerSet$Event found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ListenerSet$IterationFinishedEvent found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ListenerSet$ListenerHolder found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.Log found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.LongArray found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.MediaFormatUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.MimeTypes found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.MimeTypes$CustomMimeType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.MimeTypes$Mp4aObjectType found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NetworkTypeObserver found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NetworkTypeObserver$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NetworkTypeObserver$Config found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NetworkTypeObserver$Listener found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NetworkTypeObserver$Receiver found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NetworkTypeObserver$TelephonyManagerListener found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NonNullApi found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NotificationUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.NotificationUtil$Importance found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ParsableBitArray found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.ParsableByteArray found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.PriorityTaskManager found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.PriorityTaskManager$PriorityTooLowException found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.RepeatModeUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.RepeatModeUtil$RepeatToggleModes found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.RunnableFutureTask found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.SystemClock found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.SystemHandlerWrapper found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.SystemHandlerWrapper$1 found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.SystemHandlerWrapper$SystemMessage found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.TimedValueQueue found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.TimestampAdjuster found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.TraceUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.UnknownNull found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.UriUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.Util found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.XmlPullParserUtil found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.util.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.video.ColorInfo found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.video.VideoSize found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)
Duplicate class com.google.android.exoplayer2.video.package-info found in modules jetified-exoplayer-common-2.16.0-runtime (com.google.android.exoplayer:exoplayer-common:2.16.0) and jetified-library-common-release-runtime (library-common-release.aar)

Go to the documentation to learn how to [Fix dependency resolution errors.](http://d.android.com/r/tools/classpath-sync-errors
I did Clean & rebuild and also tried Invalidate & restart
Still it does nothing i get same mentioned error. is there anything am doing wrong ?

The project builds fine. Perhaps try posting your build errors on Stack Overflow

@brentonv Thanks for confirming. The build is currently a bit hacky - mixing aar libs as well as maven dependencies which requires special care when processing dependencies. (Therefore doing any changes will require some editing.) I guess something like git submodule would improve that.

I switched to using git submodules so that should help.


Do we have a helm chart available for OWASP SKF?

No we don't have it yet, planned somewhere in the future.
Will close this issue as this is the Labs repo of SKF :)


refactor(stream): combine fetch and fetchAndDecrement

I'm putting together a PR to provide a resilient readable stream, but I figured I could merge over some changes I had made in my fork in the meantime. There was a comment indicating this should be done, so I trust it's not a huge leap.

tests failed due to being flakey afaict

Sounds reasonable to me. I somehow remember that there was something tricky in refactoring these two methods, but don't remember what. I'll try to do a proper pass later this week end.


Feature Request: Add notes

It would be super handy to be able to add notes/annotations/links to the topics as you go through. That way, if you don't quite know yet, but are part way through learning, you can leave notes for yourself about key points learned so far and where you left off. What do you think??

That sounds like a great first task. Maybe on the page you see when you click the menu icon there could be a section there to add notes for each row.
To be discussed...


How to sort a document query by a document field

I'm just getting started with Massive, so forgive my noobness...
I have a projects table filed with project documents that were stored using the standard saveDoc() method. I would like to retrieve a limited list of projects sorted by an updatedAt field that is within the document body.
I've tried things like this without luck:
db.find({}, {order: 'body->>updatedAt', limit: 10}, callback);

What is the best process to do this (or do I need to store the updatedAt field outside the body as a standard date column)?
On a related matter, is it possible to only include only some of the fields from the document in the result set (like we can use the columns option for normal queries), or is that something that has to be done after the query?
Thanks.

Just to answer my own immediate question I realised it is probably easier to create the SQL directly and then use the db.run(sql, callback) method:
SELECT id, body->>'title' AS title, body->>'updatedAt' AS updated_at
FROM projects
ORDER BY body->>'updatedAt' DESC
LIMIT 10

...still getting used to the new JSON capabilities in Postgres ;)

What do you mean by "without luck"? At a glance, db.find is incorrect -- finders and other table crud functions should be invoked via db.mytable.find(...). saveDoc is the exceptional case here since you don't have to have the table already created.
Returning partial documents isn't supported, and honestly if I found myself considering that my first instinct would be to go back and take a good long look at my data model to see if the document needs to be broken up or if certain fields should be columns instead. I don't know your specific needs, of course, but it's a bit of a red flag.

The ->> operator turns a value into text - so your ordering won't be what you expect here. Give this a try:
SELECT id, body->>'title' AS title, body->>'updatedAt' AS updated_at
FROM projects
ORDER BY body->>'updatedAt'::date DESC
LIMIT 10

Glad you saw the benefit of using SQL in this case :). Also - if you use this query a lot you can stick it a SQL file and call it directly.
@dmfay there are a number of reasons for partial documents - the biggest being the use of an "Event Source" if you will. I use this concept a lot (storing a TON of information about a given event in one place). But I do agree with you that if you're querying it often, it's probably a good idea to peal it apart.

Sorry there was a typo above, my actual code did have this:
db.projects.find({}, {order: 'body->>updatedAt', limit: 10}, callback);

which was giving the error column "updatedat" does not exist.
Later I will probably end up adding separate columns for the fields that I need in the listing without having to inspect the entire document body for each. For the moment though while things are in flux it is nice not to have to add additional fields to the table until I know they are definitely needed.

@robconery thanks for the tips!
I'm really liking what I've seen in Massive so far :)